image.png

CMS:

Concurrent Mark Sweep,老年代

CMS以获取最小停顿时间为目的。

  • 初始标记(STW)
    • 标记 GC Root直接关联的对象
  • 并发标记
    • 与用户线程并发执行
    • 标记所有可达的对象
  • 并发预清理
    • 标记对象:从新生代晋升的对象、新分配到老年代的对象、并发阶段被修改了的对象
  • 重新标记(STW)
    • 暂停用户线程,多线程修正标记
  • 并发清理
    • 清理未被标记地对象
  • 重置
    • 清除标记,为下次回收做准备

image.png
缺点:

  • 使用标记-清除算法,会产生大量的内存碎片。需要在指定次数的 Full GC 后进行内存整理,STW。

G1:

G1收集器+回收流程+推荐用例:https://zhuanlan.zhihu.com/p/59861022
G1 将 JVM 的堆分为多个大小相等的独立区域(Region),保留新生代和老年代的概念,但它们分别是一部分 Region (不一定连续)的集合。
image.png
默认分成 2048 份,每份大小为 1M ~ 32M,2 的幂次方。
Humongous:存储那些超过 50% Region 大小的对象,专门存放大对象。

  • 如果一个 H 区装不下一个大对象,则会使用连续的 H 区,有时候会触发 Full GC。

步骤:
GC 垃圾回收器 - 图4

  • 初始标记:
    • STW,标记 GC Root 直连对象
  • 并发标记:
    • 可达性分析,耗时较长
  • 最终标记:
    • STW,修正标记
  • 筛选回收:
    • 堆 Region 的回收价值和成本进行排序,根据用户期望的 GC 停顿时间,回收部分 Region

Young GC 和 Mixed GC
TODO

优点:

  • 并行与并发:
    • 多核并行,用户线程并发
  • 分代收集:
    • 独立管理整个堆,分代收集
  • 空间整合:
    • 整体上是标记-整理,局部(Region)是复制算法。都不会产生内存碎片
  • 可预测的停顿:
    • 可以指定 M 毫秒内,垃圾收集时间不能超过 N 毫秒
    • RSTJ 实时 Java 的垃圾收集器的特征