堆
几乎所有的对象,都存放在堆中
堆是完全自动化管理的,通过垃圾回收机制
垃圾对象会自动清理,不需要显式的释放
堆的内存模型
垃圾收集机制的不同,堆内存结构可能不同
新生代,存放新生的对象,或者年龄不大的对象
老年区,存放老年对象,年龄比较大
对象年龄
对象没经过一次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回收
原因是栈中存在这些对象的引用,通过代码优化解决