博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JVM内存结构及内存溢出分析
阅读量:6339 次
发布时间:2019-06-22

本文共 1093 字,大约阅读时间需要 3 分钟。

1.了解JVM

  Java虚拟机是java的核心和基础,在java编译器和os平台之间的虚拟处理器。它是一种基于下层的操作系统和硬件平台并利用软件方法来实现的抽象的计算机,可以在上面执行java的字节码程序。

2.JVM内存结构

  

 

所有线程共享的内存数据区:方法区,堆。而虚拟机栈,本地方法栈和程序计数器都是线程私有的。

   1、存放于栈中的:

    a 每个线程包含一个栈区,栈中只保存基础数据类型的对象和自定义对象的引用(如变量的名字)。

    b每个栈中的数据(基础数据类型和对象引用)都是私有的,其他栈不能访问。

    c 方法的形式参数,方法调用完后从栈空间回收。

    d 引用对象的地址,引用完后,栈空间地址立即被回收,堆空间等待GC。

   2、存放于堆中的:

    a 存储的全部是对象,每个对象包含一个与之对应的class信息

    b Jvm只有一个堆区(heap)被所有线程共享,堆区中不存放基本类型和对象引用,只存放对象本身

   3、存放于方法区中的:

    a 存放线程所执行的字节码指令

    b 跟堆一样.被所有线程共享.方法区包含:static变量

  注意、Class实例在jdk1.6及之前是存放在方法区中, 在jdk1.7及之后存放在堆中。

     常量池在jdk1.6及之前是存放在方法区中,在jdk1.7存放在堆中,在jdk1.8存放在元空间中。

 3.JVM堆内存溢出

  

  

 

  分析堆内存溢出的原因可能如下:

    a.  使用了大量的递归或无限递归(递归中用到了大量的新建的对象)

    b.  使用了大量循环或死循环(循环中用到了大量的新建的对象)

    c.  类中和引用变量过多使用了Static修饰 如public staitc Student s;在类中的属性中使用 static修饰的最好只用基本类型或字符串。如public static int i = 0; //public static String str;

    d.  数组,List,Map中存放的是对象的引用而不是对象,因为这些引用会让对应的对象不能被释放,会大量存储在内存中。

4.JVM栈内存溢出

   

  

   分析栈内存溢出的原因可能如下:   

    a.  使用了大量的递归或无限递归

    b.  使用了大量循环或死循环(如循环中不停调用方法)

    c.  list,map,数组等长度过大等。

 

转载于:https://www.cnblogs.com/ywb-articles/p/10530813.html

你可能感兴趣的文章
多用户虚拟Web3D环境Deep MatrixIP9 1.04发布
查看>>
求高手,求解释
查看>>
[MSSQL]NTILE另类分页有么有?!
查看>>
winform datagridview 通过弹出小窗口来隐藏列 和冻结窗口
查看>>
Jquery闪烁提示特效
查看>>
最佳6款用于移动网站开发的 jQuery 图片滑块插件
查看>>
C++ String
查看>>
获取系统托盘图标的坐标及文本
查看>>
log4j Test
查看>>
HDU 1255 覆盖的面积(矩形面积交)
查看>>
SQL数据库无法附加,提示 MDF" 已压缩,但未驻留在只读数据库或文件组中。必须将此文件解压缩。...
查看>>
第二十一章流 3用cin输入
查看>>
在workflow中,无法为实例 ID“...”传递接口类型“...”上的事件“...” 问题的解决方法。...
查看>>
获取SQL数据库中的数据库名、所有表名、所有字段名、列描述
查看>>
Orchard 视频资料
查看>>
简述:预处理、编译、汇编、链接
查看>>
调试网页PAIP HTML的调试与分析工具
查看>>
路径工程OpenCV依赖文件路径自动添加方法
查看>>
玩转SSRS第七篇---报表订阅
查看>>
WinCE API
查看>>