CMS:
Concurrent Mark Sweep,老年代
CMS以获取最小停顿时间为目的。
- 初始标记(STW)
- 标记 GC Root 能直接关联的对象
- 并发标记
- 与用户线程并发执行
- 标记所有可达的对象
- 并发预清理
- 标记对象:从新生代晋升的对象、新分配到老年代的对象、并发阶段被修改了的对象
- 重新标记(STW)
- 暂停用户线程,多线程修正标记
- 并发清理
- 清理未被标记地对象
- 重置
- 清除标记,为下次回收做准备
缺点:
- 使用标记-清除算法,会产生大量的内存碎片。需要在指定次数的 Full GC 后进行内存整理,STW。
G1:
G1收集器+回收流程+推荐用例:https://zhuanlan.zhihu.com/p/59861022
G1 将 JVM 的堆分为多个大小相等的独立区域(Region),保留新生代和老年代的概念,但它们分别是一部分 Region (不一定连续)的集合。
默认分成 2048 份,每份大小为 1M ~ 32M,2 的幂次方。
Humongous:存储那些超过 50% Region 大小的对象,专门存放大对象。
- 如果一个 H 区装不下一个大对象,则会使用连续的 H 区,有时候会触发 Full GC。
步骤:
- 初始标记:
- STW,标记 GC Root 直连对象
- 并发标记:
- 可达性分析,耗时较长
- 最终标记:
- STW,修正标记
- 筛选回收:
- 堆 Region 的回收价值和成本进行排序,根据用户期望的 GC 停顿时间,回收部分 Region
Young GC 和 Mixed GC
TODO
优点:
- 并行与并发:
- 多核并行,用户线程并发
- 分代收集:
- 独立管理整个堆,分代收集
- 空间整合:
- 整体上是标记-整理,局部(Region)是复制算法。都不会产生内存碎片
- 可预测的停顿:
- 可以指定 M 毫秒内,垃圾收集时间不能超过 N 毫秒
- RSTJ 实时 Java 的垃圾收集器的特征