上节讲解:JVM中G1收集器新生代垃圾回收
本节讲解:G1老年代垃圾回收的过程
初始标记
这个过程是需要进入”Stop the World”的,仅仅只是标记一下GC Roots直接能引用的对象,这个过程速度是很快的。先停止系统程序的运行,然后对各个线程栈内存中的局部变量代表的GC Roots,以及方法区中的类静态变量代表的GC Roots进行扫描,标记出来他们直接引用的那些对象,跟CMS的第一步是一样的,如下图:
并发标记
接着会进入”并发标记”的阶段,这个阶段会允许系统程序的运行,同时进行GC Roots追踪,从GC Roots开始追踪所有的存活对象,如下图所示:
如果关于程序中那些是GC Roots不懂的,可以查看我的18讲(CMS收集器的初始标记),里面有进行代码介绍。
最终标记
接着是最终标记阶段,这个阶段会进入”Stop the World”,系统程序是禁止运行的,但是会根据并发标记阶段记录的那些对象修改,最终标记一下有哪些存活对象,有哪些是垃圾对象,如下图所示。
混合回收(也可以叫筛选回收)
这个阶段会计算老年代中每个Region中的存活对象数量,存活对象的占比,还有执行垃圾回收的预期时间和效率。接着会停止系统程序,然后全力以赴尽快进行垃圾回收,此时会选择部分Region进行回收,因为必须让垃圾回收的停顿时间控制在我们指定的范围内。
比如有1000个Region满了,根据预定目标,本次垃圾回收只能停顿200毫秒,通过计算得知,回收800个Region刚好200ms,那么就只会回收800个Region,把GC的停顿时间控制在指定的范围内,如下图。
什么叫混合回收?什么时候触发新生代+老年代的混合垃圾回收?
G1有一个参数,是“-XX:InitiatingHeapOccupancyPercent”,他的默认值是45%,意思就是说,如果老年代占据了堆内存的45%的Region的时候,此时就会尝试触发一个新生代+老年代和大对象一起回收的混合回收阶段。
比如按照我们之前说的,堆内存有2048个Region,如果老年代占据了其中45%的Region,也就是接近1000个Region的时候,就会开始触发一个混合回收,如图:
下节讲解:G1垃圾回收器有哪些参数?如何设置优化及特点。
声明:本站部分文章内容及图片转载于互联 、内容不代表本站观点,如有内容涉及侵权,请您立即联系本站处理,非常感谢!