【JVM调优实战】13-经典收集器下-G1
经典收集器(下):G1 深度剖析
本文是《JVM调优实战》专栏第 13 讲。
引言
上一讲我们分析了CMS——那个以"低停顿"为目标但最终被算法缺陷拖垮的悲情英雄。G1(Garbage First)正是CMS的继任者,从JDK 7的实验性特性,到JDK 8的稳定版本,再到JDK 9的默认收集器——G1完成了一条完美的进化曲线。
G1最吸引人的地方在于它同时解决了CMS的两大痛点:不可预测的停顿时间和内存碎片。它不承诺零停顿,但它承诺停顿时间是可预测、可控制的。对于大多数服务端应用来说,这个承诺比"理论上最短"更有价值。
本讲将深入G1的内部机制——从Region化堆布局到混合GC,从SATB到Remembered Set,让你真正理解"Garbage First"这个名字背后的设计哲学。
Region:打破物理分代的革命
传统分代的局限性
在G1之前,新生代和老年代在物理内存上是连续分区的。比如:堆的前500MB是新生代,后面1.5GB是老年代。这种布局简单直观,但有一个致命问题:停顿时间受新生代大小制约。新生代越大,单次Minor GC收集的Eden+Survivor就越多,STW时间就越长。
CMS试图通过并发来绕过这个问题,但碎片化始终无解
