共计 2014 个字符,预计需要花费 6 分钟才能阅读完成。
G1 垃圾收集器简介
Garbage First(简称:G1)收集器是垃圾收集器技术倒退历史上的一个里程碑, 它创始了收集器面向部分收集的设计思路和基于 Region 的内存布局模式.
G1 是一款次要面向服务端利用的垃圾收集器,HotSpot 开发团队赋予它的冀望是将来能够替换掉 JDK5 中公布的 CMS 收集器. JDK9 公布之日,G1 发表取代了
Parallel Scavenge
加Parallel Old
的组合, 成为服务端模式下默认的垃圾收集器, 而 CMS 则被申明为 (Deprecate) 应用的收集器.G1 实现了可控进展工夫的垃圾收集器, 通过
-XX:MaxGCPauseMillis
参数进行设置,默认是 200ms。
Region 简介
G1 创始了基于 Region 的堆内存布局, 尽管 G1 也遵循分代思维, 然而堆内存布局和其它垃圾收集的内存布局有着微小的变动. G1 垃圾收集器不再保持固定大小分代分区, 而是把间断的堆内存分成大小一样的独立区域 (Region), 每一个 Region 能够依据须要表演
新生代 (Eden)
,Survivor 空间
,老年代
。G1 垃圾收集器能够依据表演不同角色的 Region 采纳不同的策略去解决,这样无论是新创建的对象,还是曾经存活了一段时间的对象, 或则经验过很屡次垃圾收集然而还存活下来的对象, 都会有很好的成果。
G1 中五种不同的 Region
- 新生代(Eden Region)
- 年老代(Survivor Region)
- 老年代(Old Region)
- 巨型对象(Humongous Region)
- 未调配(Free Region)
巨型对象区(Humongous Region)
Region 中有一种非凡的
Humongous Region
, 专门用来存储大对象。G1 收集器规定只有对象的大小超过了Region
大小的个别就会被认为是巨型对象。每个 Region 的大小能够通过-XX:G1HeapRegionSize
来调整 (1MB-32MB, 且为 2 的 N 次幂)。G1 收集器通常把Humongous Region
看做老年代的一部分。
对象划分的规定
- 对象大小小于一半
Region
, 间接存储到标记为 Eden 的 Region - 对象大小大于一半
Region
然而小于一个Region
, 存储到标记为 Humongous 的 Region 中 - 对象大小超过一个
Region 大小
, 存储到标记为 Humongous 的多个间断 Region 中
GC 类型
- youngGC: 回收 Eden 区和 Survivor 区
- MixedGC: 回收所有的新生代和局部老年区
- FullGC: 回收整个堆
Remenbered Set, 简称 RSet
因为分代的内存不间断, 导致 GC 搜寻垃圾对象时, 须要扫描整个堆。为了解决这个问题,G1 为每个 Region 都保护了一个
Remenbered Set
, 用来记录对象的援用状况, 当 GC 产生的时候依据Remenbered Set
的索引状况去搜寻。
Remenbered Set 存储的援用关系类型
- 1. 分区内援用
- 2. 新生代分区 Y1 援用新生代分区 Y2
- 3. 新生代分区 Y1 援用老年代分区 O1
- 4. 老年代分区 O1 援用新生代分区 Y1
- 5. 老年代分区 O1 援用老年代分区 O2
youngGC
时,GC Root 次要是两类, 栈空间和老年代到新生代辨别的援用 (2,3) 关系。MixedGC
时, 因为只收集老年代区, 所以老年代分区援用 (4,5) 关系将被应用。
G1 垃圾收集器执行步骤
初始标记
标记 GC Roots 可能间接关联的对象 (Root Region), 批改
TAMS
指针的值, 使的下一阶段用户线程并发运行时, 能在正确的 Region 中调配对象。须要进展用户线程, 但耗时很短, 且借助
Minor GC
时同步实现。
- TAMS:Top at Mark Start,Region 中的指针,用于并发标记时为对象分配内存空间。
根分区扫描
拿到初始标记的
Root Region
, 扫描整个堆的所有Region
的Rset
看是否有Root Region
, 并标记Region
并发标记
遍历上一步标记过的 Region 对堆中对象进行可达性剖析, 递归扫描整个堆里的对象图, 找到要回收的对象。耗时较长, 能够和用户线程并行。
耗时较长, 可遇用户线程并行, 当对象扫描实现当前, 还要重新处理 SATB 记录下的在并发时有援用变动的对象。
从新标记
短暂的暂停用户线程, 用于解决
并发标记
阶段遗留下来最初大量的 SATB 记录。
筛选回收
负责更新 Region 的统计数据, 对各个 Region 的回收价值进行排序, 依据用户所期待的进展工夫, 来制订回收打算, 能够自由选择任意组合的
Region
进行回收, 而后将须要回收的 Region 中的对象复制到空的Region
, 再清理掉整个旧的Region
. 这里波及挪动存活对象, 所以也要暂停用户线程, 由多条收集器线程并行实现。
G1 提高效率的有哪些点
- 应用 Rset 升高了扫描范畴
- 从新标记阶段应用 SATB 速度比 CMS 的增量更快
- 清理过程中, 抉择局部回收价值高的
Region
进行清理 (MixedGC), 而不是所有的Region
进步了清理效率。