Java虚拟机分代收集

分代收集过程:
a、对象优先分配到Eden(伊甸园)区,Eden区满了之后会触发一次young gc,回收没有引用的垃圾对象,除非young gc 的时候,程序暂停工作;
b、此时Eden区有了空间,可以继续放new的对象,当Eden区再次满了之后,会再次触发young gc回收垃圾对象,剩下的有引用的对象会去到s1,其中一个存活区,同时s0区的垃圾对象也被回收,存活的对象也会去到s1区,确保两个存活区有一个为空;
注意:young gc 的时候会对Eden区和一个有引用的存活区进行垃圾回收;
c、大对象直接进入老年代,大对象的大小可以设置;
d、长期存活的对象,即age大于一定年龄的对象直接进入老年代,age=gc 的次数,可以设置;
e、老年代满了以后会触发full gc,full gc 会对整个堆和堆外内存进行垃圾回收,full gc 的时间很长,应尽量延长full gc的时间,减少full gc 的频率;
 
对象动态分配原则:
相同age对象的大小之和大于存活区一半内存大小的时候,会把大于或等会这个age的对象分配到老年区;
 
空间担保原则:
每次进行young gc 的时候都会判断一次老年代是否有足够的空间可以装存活对象,如果空间足够,可以进行young gc。
如果老年代空间不足,就要看是否设置了空间担保原则,如果设置为允许风险,即使老年代空间不足,也会尝试进行young gc;如果设置为不允许风险,则要进行一次full gc。
 
为什么要进行分代收集:
因为研究发现,代码里大多数都是生命周期短的小对象,大对象占很少的比例,所以分代收集可以在早期就回收掉垃圾对象,减少了full gc 的频率。
 
什么时候触发young gc:
eden区满了的时候
 
什么时候触发full gc:
老年代满了的时候
空间担保原则设置为不允许担保的时候
程序里用代码实现的时候
堆外内存满了时候(例如方法区满了的时候)

 

posted @ 2021-07-22 00:31  大黄与小白  阅读(59)  评论(0)    收藏  举报