JDK8 GC 分代垃圾回收之 内存分配

Posted 川雨淅

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JDK8 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。

以上是关于JDK8 GC 分代垃圾回收之 内存分配的主要内容,如果未能解决你的问题,请参考以下文章

垃圾分代回收机制

JVM(二) GC算法与分代回收策略

python的垃圾回收机制

JVM垃圾回收算法及分代垃圾收集器

JavaScript性能优化1——内存管理(JS垃圾回收机制引用计数标记清除标记整理V8分代回收Performance使用)

面试必看--Java—GC垃圾回收