JVM学习记录—详解G1垃圾回收器
目录
本文主要参考狸猫技术窝文章
之前的文章https://blog.****.net/e5yrt2/article/details/105540664,大致介绍了JVM相关的垃圾回收器,有CMS、PreNew和G1垃圾回收器。而G1(GarbageFirst)是性能最好,同样也是jdk9默认的垃圾回收器。
G1回收器模型
那么有多少Region?每个Region又有多大?
因为新生代和老年代都会被Region管理,默认来说,Region的大小为分配的堆内存的大小除以2048。
比如分配的堆内存为4G,那么分配到每个Region的大小为2MB。
新生代Region分配
JVM中有-XX:G1NewSizePercent 这个配置用来设置初始化时候新生代的比例的。
新生代如何进行垃圾回收?
假设新生代默认分配的是堆内存的60%,那么新生代约占有1200个Region,S1和S2分别有100,具体分配如下图
这时候触发新生代的GC,G1就会用之前说过的复制算法来进行垃圾回收,进入一个“Stop the World”状态,然后把Eden对应的Region中的存活对象放入S1对应的Region中,接着回收掉Eden对应的Region中的垃圾对象 。这个跟之前的回收方式一致。
新生代进入老年代
进入老年代的条件跟原有的一致
1、躲过多次垃圾回收后进入老年代
2、MinorGC后存活对象超过S区的50%
大对象问题?
之前的方案中,大对象会被直接分配到老年代。而在G1回收器中,大对象可以横跨多个Region存放,如下图。