回收集合CollectionSet

回收集合CollectionSet

回收集合CollectionSet #

G1 的垃圾回收模式有两种:分别是 young GC 和 mixed GC。

  1. young GC:只回收年轻代的 Region。
  2. mixed GC:回收全部的年轻代 Region,并回收部分老年代的 Region。

无论是 young GC 还是 mixed GC,都会回收全部的年轻代,mixed 回收的老年代 Region 是需要进行决策的(Humongous 在回收时也是当做老年代的 Region 处理的)。那么决定老年代 Region 是否被回收的因素具体有哪些呢?

我们把 mixed GC 中选取的老年代对象 Region 的集合称之为回收集合(Collection Set,CSet)。CSet 的选取要素有以下两点:

  1. 该 Region 的垃圾占比。垃圾占比越高的 Region,被放入 CSet 的优先级就越高,这就是垃圾优先策略(Garbage First),也是 G1 GC 名称的由来。
  2. 建议的暂停时间。建议的暂停时间由 -XX:MaxGCPauseMillis 指定,G1 会根据这个值来选择合适数量的老年代 Region。

MaxGCPauseMillis 默认是 200ms,一般不需要进行调整,如果需要停顿时间更短可以对它进行设置,不过需要注意的是,MaxGCPauseMillis 设置的越小,选取的老年代 Region 就会越少,如果 GC 压力居高不下,就会触发 G1 的 Full GC。

触发 G1 的 Full GC 代价是很高的。最早的实现是一个单线程的 Mark-Compact GC,停顿时间非常长,虽然后来也改进成多线程,但还是需要尽量避免触发 G1 的 Full GC。如果一个应用会频繁触发 G1 GC 的 Full GC,那么说明这个应用的 GC 参数配置是不合理的,理想情况下 G1 是没有 Full GC 的。

Viewpoint #

From #

22 | G1 GC:分区回收算法说的是什么?