将对象从年轻代到老年代是如何判断该对象执行了多久?以及什么情况下发生转移?那些对象在老年代中?

Minor GC发生在年轻代,频率较高速度较快

Major GC 是清理老年代

Full GC 是清理整个堆空间,包括年轻代和老年代

一般新生成的对象都出现在Eden区,当Eden区被填满时,所有经过垃圾回收还存活的对象被复制到两个Survivor区域中的一个,我们假定是From区(两个区域实际上没有任何区别,From和To只是为了更好的说明工作流程),当From区域也被填满时,这个区域经过垃圾回收仍存活的对象将会被复制进入To区域,原From区域被清空,并且从Eden区过来的数据将直接进入To区域。当To区域也被填满时,之前从From区域过来的那部分数据如果仍在活动,将会被放到老年代。需要注意的是,两个Survivor区域总有一个会是空的。

通过年龄计数器。对象每经过了一个GC仍然存活,年龄计数器加一。当年龄超过了设定的值;则将其通过担保机制转移到老年代。或者动态判定,当survivor中年龄相同的多个对象的总和超过了survivor的一半,则将年龄大于等于该年龄的对象转移到老年代,无需等待设置的最大年龄值。年龄大的对象直接进入老年代。

在Minr GC 之前,首先会检查老年代的可使用空间是否大于年轻代的对象的总和,若大于则是一次安全的GC。若不大于且是否允许担保失败设置为TRUE,则计算历次晋升到老年的对象的平均大小是否大于老年代的最大可用空间,若大于则进行一次冒险的Minor GC,因为有可能老年代不能满足空间的需求,则进行一次Full GC; 若不大于且是否允许担保失败设置为FALSE,则进行一次Full GC,让老年代腾出更多的空间。之所以存在Min GC是因为年轻代每次只使用一个survivor保存仍然存活的对象。

同时,如果在一次安全的minor GC 的时候,仍然存活的对象不能在另一个survivor中全部容纳,会通过担保机制直接进入老年代。但是Full GC 与 Minor GC 相比,比较耗时。老年代的对象: 1.大对象(字符串与数组),即超过了设定的值的对象,直接在老年代中分配; 2.长期存活的对象进入老年代

发布了109 篇原创文章 · 获赞 2 · 访问量 2920

猜你喜欢

转载自blog.csdn.net/baidu_41592938/article/details/104567326