一 G1 GC的垃圾回收过程主要包括如下三个环节。
-
年轻代GC(Young GC)
-
老年代并发标记过程(Concurrent Marking)
-
混合回收(Mixed GC)
如果需要,单线程、独占式、高强度的 FullGC 还是继续存在的。它针对 GC 的评估失败提供了一种失败保护机制,即强力回收。
顺时针,young gc -> young gc+concurrent mark->Mixed GC 顺序,进行垃圾回收。
应用程序分配内存,当年轻代的 Eden 区用尽时开始年轻代回收过程;G1 的年轻代收集阶段是一个并行的独占式收集器。在年轻代回收期,G1 GC 暂停所有应用程序线程,启动多线程执行年轻代回收。然后从年轻代区间移动存活对象到 Survivor 区间或者老年区间,也有可能是两个区间都会涉及。
当堆内存使用达到一定值(默认45%)时,开始老年代并发标记过程。
标记完成马上开始混合回收过程。对于一个混合回收期,G1 GC 从老年区间移动存活对象到空闲区间,这些空闲区间也就成为了老年代的一部分。和年轻代不同,老年代的 G1 回收器和其他 GC 不同,G1 的老年代回收器不需要整个老年代被回收,一次只需要扫描/回收一小部分老年代的 Region 就可以了。同时,这个老年代 Region 是和年轻代一起被回收的。
二 实例
一个 Web 服务器,Java 进程最大堆内存为 4G,每分钟响应 1500个请求,每45秒钟会新分配大约 2G 的内存。G1 会每45秒钟进行一次年轻代回收,每 31 个小时整个堆的使用率会达到45%,会开始老年代并发标记过程,标记完成后开始四到五次的混合回收。