介绍一下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

根分区扫描

扫描整个老年代RegionRset,标记蕴含初始标记阶段的Root RegionRegion

并发标记

遍历根分区扫描步骤标记好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)。
  • 利用在运行过程中产生大量的碎片,须要常常压缩。
  • 想要更可控,可预期的进展工夫;避免高并发下利用雪崩景象。