介绍一下 G1 垃圾收集器
G1 收集器随同 JAVA9 于 2017-9-21 公布,G1 收集器兼顾
低提早
和高吞吐
在服务端运行,HotSpot 团队冀望取代CMS
收集器。也就是在满足进展工夫的状况下获取最大的吞度量。有两种收集模式Young GC
和 Mixed GC。G1 收集器将堆内存划分成大小相等的Region
, 新生代, 老年代也就成了逻辑概念。整体上采纳的是标记 - 整顿
算法, 部分采纳了复制算法
。G1 是 jdk1.9 的默认垃圾收集器,-XX:+UseG1GC 开启
G1 收集器 Region
的类型
- 新生代
- 老年代
- 未应用
- 大对象区
新生代
,老年代
的Region
不再是一块间断的空间。当然寄存大对象的Region
必须要间断。
G1 收集器中 大对象
怎么调配
- 对象的大小 <0.5 个 RegionSize 间接存在新生代
Eden Region
区 - 对象的大小 >=0.5 个 RegionSize 且对象的大小 <1 个 RegionSize, 存到大对象区
Humongous Region
- 对象的大小 >= 1 个
RegionSize
存到间断的大对象区Humongous Region
怎么指定 Region 的大小
应用
-XX:G1HeapRegionSize
来指定Region
的大小,Region 的大小必须是 2 的幂次方, 最大 32M。
G1 垃圾收集器的运行过程?
初始标记(stop the world)
比拟
GC Roots
间接援用的对象同时标记, 同时标记GC Roots
对象所在的Region
称为Root Region
根分区扫描
扫描整个老年代
Region
的Rset
, 标记蕴含初始标记
阶段的Root Region
的Region
并发标记
遍历
根分区扫描
步骤标记好Region
, 标记所有可达对象, 和利用线程并发执行
从新标记(stop the world)
因为
并发标记
是和利用线程并发执行的, 所以不可避免的有些对象会发生变化,G1 GC 清空 SATB 缓冲区,跟踪未被拜访的存活对象,并执行援用解决。
抉择革除(stop the world)
评估每个
Region
的垃圾量, 选取回收成果最好的若干Region
收集(取决于 -XX:MaxGCPauseMillis 设置值, 默认是 200ms)。在规定进展工夫内, 获取最大的吞吐量。
什么是Rset
每个
Region
初始化时, 都会初始化一个 Rset(remembered set
), 每个Region
都蕴含一个Rset
,Rset
的作用是记录了哪些内存区域 (Region
) 堆以后Region
的援用。Rset
是一个空间换工夫的数据结构。有了 Rset 能够防止对整个堆进行扫描。
G1 和 CMS 的区别
- G1 采纳
标记 - 整顿
算法,CMS 采纳标记 - 革除
算法, 所以 G1 不会产生很多垃圾碎片. - G1 的 STW(stop the world)可控, 能够应用
-XX:MaxGCPauseMillis
设置默认 200ms - G1 的
Young GC
模式能够工作在年老代
, 而独自的CMS
只能工作在老年代
.
G1 的利用场景
- 服务端多核 CPU,JVM 占用较大的利用(至多大于 4G)。
- 利用在运行过程中产生大量的碎片, 须要常常压缩。
- 想要更可控, 可预期的进展工夫; 避免高并发下利用雪崩景象。