JVM系列 - G1收集器
Publish date: Oct 239, 23039
Last updated: Oct 289, 28089
Last updated: Oct 289, 28089
特性
主要面向服务端应用的垃圾收集器,有如下特性:
- 面向全堆的任何部分组成 回收集 进行回收
衡量标准:哪块内存中存放的垃圾数量最多,回收收益大,即 Mixed GC 模式
- 全功能的垃圾收集器
不仅关注 响应时间,而且关注 吞吐量
- 停顿时间模型
支持在长度为 M 毫秒的时间片段内,垃圾收集消耗时间不超过 N 毫秒
创新
- 开创了面向局部收集的设计思路,不再区分老年代还是新生代
- 基于 Region 的内存布局,不是固定的分代
- 收集回收思路由 一次清理干净Java堆 转变为 收集速度跟得上对象分配速度
每个 Region 都可以扮演新生代的 Eden 空间、Survivor 空间 或 老年代空间
阶段
- 初始标记:仅标记 GC Roots 能直接关联到的对象,停顿很短
- 并发标记:从 GC Roots 开始扫描对象图,与用户线程并发执行
- 最终标记:停顿用户线程,处理并发阶段遗留的少量 SATB 记录
- 筛选回收:暂停用户线程,多条收集线程并行执行
除了并发标记阶段,其他阶段都是需要 STW
由此可见,并非完全追求 低延迟,而是 延迟可控的情况下尽可能高的吞吐量
与 CMS 对比
- G1 使用标记-整理算法,CMS 使用标记-清除算法
- G1 不容易产生内存碎片,有利于程序长期运行
- 分配大对象时,G1 更容易找到合适的空间,避免提前触发下一次收集
- 内存占用,G1 比 CMS 高
G1 的堆中每个Region 要维护一份卡表,而 CMS 全局只有一份卡表
- 执行负载,G1 比 CMS 高
G1 对写屏障的复杂操作比 CMS 消耗更多的运算资源
CMS 写屏障实现是同步的,CMS 写屏障实现是异步的
- 小内存应用上,CMS 表现通常会更好,大内存应用上 G1 表现通常更好