G1收集器伴随JAVA9于2017-9-21发布,G1收集器兼顾
低延迟
和高吞吐
在服务端运行,HotSpot团队期望取代CMS
收集器。也就是在满足停顿时间的情况下获取最大的吞度量。有两种收集模式Young GC
和Mixed GC。G1收集器将堆内存划分成大小相等的Region
,新生代,老年代也就成了逻辑概念。整体上采用的是标记-整理
算法,局部采用了复制算法
。G1是jdk1.9的默认垃圾收集器,-XX:+UseG1GC开启
Region
的类型
新生代
,老年代
的Region
不再是一块连续的空间。当然存放大对象的Region
必须要连续。
大对象
怎么分配Eden Region
区Humongous Region
RegionSize
存到连续的大对象区Humongous Region
使用
-XX:G1HeapRegionSize
来指定Region
的大小,Region的大小必须是2的幂次方,最大32M。
比较
GC Roots
直接引用的对象同时标记,同时标记GC Roots
对象所在的Region
称为Root Region
扫描整个老年代
Region
的Rset
,标记包含初始标记
阶段的Root Region
的Region
遍历
根分区扫描
步骤标记好Region
,标记所有可达对象,和应用线程并发执行
由于
并发标记
是和应用线程并发执行的,所以不可避免的有些对象会发生变化,G1 GC清空 SATB缓冲区,跟踪未被访问的存活对象,并执行引用处理。
评估每个
Region
的垃圾量,选取回收效果最好的若干Region
收集(取决于-XX:MaxGCPauseMillis设置值,默认是200ms)。在规定停顿时间内,获取最大的吞吐量。
Rset
每个
Region
初始化时,都会初始化一个Rset(remembered set
),每个Region
都包含一个Rset
,Rset
的作用是记录了哪些内存区域(Region
)堆当前Region
的引用。Rset
是一个空间换时间的数据结构。有了Rset可以避免对整个堆进行扫描。
标记-整理
算法,CMS采用标记-清除
算法,所以G1不会产生很多垃圾碎片.-XX:MaxGCPauseMillis
设置默认200msYoung GC
模式可以工作在年轻代
,而单独的CMS
只能工作在老年代
.原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。