JVM学习记录—详解G1垃圾回收器

目录

G1回收器模型

新生代Region分配

 ​

新生代如何进行垃圾回收?

新生代进入老年代

大对象问题?


 

本文主要参考狸猫技术窝文章

之前的文章https://blog.csdn.net/e5yrt2/article/details/105540664,大致介绍了JVM相关的垃圾回收器,有CMS、PreNew和G1垃圾回收器。而G1(GarbageFirst)是性能最好,同样也是jdk9默认的垃圾回收器。

G1回收器模型

JVM学习记录—详解G1垃圾回收器_第1张图片

那么有多少Region?每个Region又有多大?

因为新生代和老年代都会被Region管理,默认来说,Region的大小为分配的堆内存的大小除以2048。

比如分配的堆内存为4G,那么分配到每个Region的大小为2MB。

新生代Region分配

 JVM学习记录—详解G1垃圾回收器_第2张图片

JVM中有-XX:G1NewSizePercent 这个配置用来设置初始化时候新生代的比例的。

新生代如何进行垃圾回收?

假设新生代默认分配的是堆内存的60%,那么新生代约占有1200个Region,S1和S2分别有100,具体分配如下图

JVM学习记录—详解G1垃圾回收器_第3张图片

这时候触发新生代的GC,G1就会用之前说过的复制算法来进行垃圾回收,进入一个“Stop the World”状态,然后把Eden对应的Region中的存活对象放入S1对应的Region中,接着回收掉Eden对应的Region中的垃圾对象 。这个跟之前的回收方式一致。

新生代进入老年代

进入老年代的条件跟原有的一致

1、躲过多次垃圾回收后进入老年代

2、MinorGC后存活对象超过S区的50%

大对象问题?

之前的方案中,大对象会被直接分配到老年代。而在G1回收器中,大对象可以横跨多个Region存放,如下图。

JVM学习记录—详解G1垃圾回收器_第4张图片

你可能感兴趣的:(JVM)