您的位置:首页 > 编程语言 > Java开发

Java - 对象如何从年轻代到老年代

2018-01-26 16:24 417 查看

几种 GC 方式

Minor GC:年轻代,频率高,速度快
Major GC:老年代
Full GC:整个堆(年轻代,老年代)

对象的生命历程

一般新生对象要进入Eden 区,Eden 区被填满时,要进行GC,GC之后还存活的对象将被复制到两个Survivor 区域中的一个。假定该Survivor 为From 区,From 区被填满之后,这个区域也要进行GC,GC 之后存活的的对象将会复制到To 区,From区清空。To区也被填满时,之前从From 区复制过来的那部分对象仍在活动则进入老年代。(From,To 必有一区会是空的)

对象年龄与转移时机

通过年龄计数器判断一个对象是否需要转移。对象每经过一个GC 仍然活着,年龄计数器加1。当年龄超过设定的值,则将其通过担保机制转移到老年代。
也可以动态判定,当Survivor 中 年龄相同的对象超半数,则年龄大于该年龄的对象转移到老年代,无需等待到达设置的最大年龄值。
大对象直接进入老年代。

GC 安全检查

在Minor GC 之前,检查老年代的可用空间是否大于年轻代的对象总和,若大于则是一次安全的Minor GC,不大于[ 允许担保失败],则比较历次晋升到老年代的对象的平均大小是否大于老年代的最大可用空间,若大于则进行一次冒险的Minor GC。
有可能老年代不满足空间需求(不大于,并且不允许担保失败),则进行一次Full GC。
Minor GC 存在的原因是,年轻代只使用要给Survivor 保存仍存活的对象。
在一次安全Minor GC 中,仍然存活的对象不能在另一个Survivor 完全容纳,则会通过担保机制进入老年代。

老年代的对象

大对象(字符串与数组),即超过了设定值的对象
长期存活的对象
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: