JVM GC 垃圾回收(一)之 分代内存分配
Eden ——> Survivor(From ——> To) ——> Old
1、先在Eden区给新对象分配空间(大对象,很长的字符串、数组。直接分配在Old区),Eden区没有足够的空间分配时 ——> YGC;
GC开始时,Eden区对象全部进入To Surivor区,From Survivor中的对象年龄超过阈值(15,每次未回收标志加一)的对象进入Old区,
如果Survivor区中某一年龄的对象 >= Survivor区的一半,那么 >= 该年龄的对象直接进入Old区。
2、其他进入To Survivor区。然后,Eden 区, From Survivor区清空。From Survivor , To Survivor角色互换;
3、如果To Survivor区没有足够空间容纳Eden,From Survivor中的对象,需要Old区分配担保,分配到Old区中。如果Old区分配空间不够,Out memory。
Old区分配担保:
Minor GC之前,检查Old 最大可用连续空间是否大于新生代所有对象总空间:
大于,Minor GC安全;
否则,虚拟机查看HandlePromotionFailure 设置值是否允许担保失败:
允许,继续检查Old区最大可用的连续空间是否大于历次晋升到Old区对象的平均大小:
大于,尝试 Minor GC,尽管存在风险。
小于,或者不允许担保失败,则进行 Full GC。
JDK8 元空间替换了永久区,字符串,方法可以直接分配在内存中,避免 插入 永久区大小,Perm out memory。