JVM堆

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

堆的内存模型

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

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

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

永久区,存放永久数据
JVM堆_第1张图片

新生代

分为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回收
原因是栈中存在这些对象的引用,通过代码优化解决

你可能感兴趣的:(————JVM)