JVM堆

 发布日期:2018-10-18 11:45:03  阅读次数:阅读数:36  来源:
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/nangeali/article/details/81569316

几乎所有的对象,都存放在堆中
堆是完全自动化管理的,通过垃圾回收机制
垃圾对象会自动清理,不需要显式的释放

堆的内存模型

垃圾收集机制的不同,堆内存结构可能不同

新生代,存放新生的对象,或者年龄不大的对象
老年区,存放老年对象,年龄比较大

对象年龄
对象没经过一次GC,年龄就会加1
一般,经过15次GC之后,还活着,也就是达到15岁之后,就会放到老年区

永久区,存放永久数据
这里写图片描述

新生代

分为edan区、S0区、S1区
也称为伊甸园区、from区、to区

From区、to区,也称为幸存取
是两块大小相等,并且,可以互换角色的空间

GC处理过程

伊甸园区

首先,对象存储在伊甸园区
经过一次GC之后,存放在幸存区

幸存区

幸存区包括S0、S1区,或者说from区、to区
再经过一次GC之后,对象从from区,到to区
再经过一次GC之后,对象从to区,到form区
再经过一次GC之后,对象从from区,到to区
如此反复……

直到对象的年龄到达15岁之后,就会被放到老年区
这也是,为什么幸存区中的S0、S1区
两个区大小相等,并且,可以互换角色

老年区

老年区满了,就会产生MajorGC,FullGC,进行养老区的内存清理
如果,执行完成FullGC之后,依然无法进行对幸存区中对象的保存,就会产生OOM异常——OutOfMemoryError

OutOfMemoryError

原因分析
JVM堆内存不够,内存溢出
1、JVM堆内存设置不够,可以通过参数调整
2、代码创建了大量的大对象,并且,长时间不能被GC回收
原因是栈中存在这些对象的引用,通过代码优化解决

如果您有好的新闻与建议,欢迎点击文章投稿

    发表评论

    电子邮件地址不会被公开。

  • 内容

  • 网名