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。

posted @ 2018-02-11 15:21  川雨淅  阅读(149)  评论(0编辑  收藏  举报