JVM G1收集器小记

364 阅读2分钟

G1特点

  1. 可以基于用户设定的停顿时间,去回收。
  2. 没有full gc

G1中的几个概念

Region

将堆区划分为多个Region,每个Region可以表示新生代,老年的等。 image

每个Region大小是2的幂次方。Humongous是专门用来存放大对象的(超过Region大小一般的对象),并且直接放在老年代。

SATB

SATB原始快照,通过三色标记算法来处理并发标记时用户线程更新引用的问题。

PS: 并发标记的两种处理方法:增量更新与原始快照

RSet

用来辅助GC过程,每个Region都有RSet记忆集。 RSet用来记录别的Region指向自己的指针,并记录指针分别在哪些Card范围内。

image

Pause Prediction Model

停顿预测模型,通过用户设定的GC停顿时间(参数-XX:MaxGCPauseMillis),G1以衰减平均值为理论基础,计算需要回收的Region数量从而进行满足。

G1收集器执行过程

  1. 初始标记 STW,仅标记GC ROOT能直接关联的对象。并修改TAMS指针(确保用户线程能正确的创建新的对象)。

  2. 并发标记 递归整个对象图,与用户线程并发执行。扫描完成后处理SATB记录下的引用变动的对象。

  3. 最终标记 STW,处理并发标记遗留的SATB记录。

  4. 筛选回收 STW,负责更新Region的统计数据,对各个Region的回收价值与成本排序,根据用户设定期望的停顿时间来制定回收计划,可以选择任意多个Region数量构成回收集合。然后把决定回收的那一部分Region中存活的对象复制到空的Region,再清理掉旧Region的全部空间。

参考

  1. 书籍:深入理解JVM
  2. tech.meituan.com/2016/09/23/…