介绍一下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)。
- 利用在运行过程中产生大量的碎片,须要常常压缩。
- 想要更可控,可预期的进展工夫;避免高并发下利用雪崩景象。