G1入门理解
什么是G1(Garbage-First)
G1是jdk1.9的默认垃圾收集器,G1收集器兼顾低延迟和高吞吐在服务端运行,HotSpot团队期望取代CMS收集器。也就是在满足停顿时间的情况下获取最大的吞度量。有两种收集模式Young GC和Mixed GC。G1收集器将堆内存划分成大小相等的Region,新生代,老年代也就成了逻辑概念。整体上采用的是标记-整理算法,局部采用了复制算法。
每一个方块叫做region,堆内存会分为2048个region,每个region大小等于堆内存除以2048。还是分为Eden区、S0区、S1区、老年代,只不过空间可以是不连续的了。Humongous区是专门用来存放大对象的(如果一个对象超过region的50%,那么就是大对象)
G1如何工作
初始标记:
- 和CMS类似,根据GC Roots找到直接引用对象
- 一旦标记完,就恢复线程继续工作
- 过程非常快
并发标记:
- 和CMS类似,不需要STW,用户线程和垃圾收集线程并行工作,去找到其他可达对象
- 时间比较短
- 三色标记
最终标记:
- 上一个阶段标记的对象,可能有误差,需要进行修正
- 需要STW,时间也不是很长
- 原始快照
筛选回收:
- 类似CMS的并发清除阶段
- 需要CMS来清除对象
- 可以通过:-XX:MaxGCPauseMillis来指定GC的STW停顿的时间,所有可能并不会回收掉所有的垃圾对象,默认200ms
- 采用的复制算法,不会产生碎片(会把某个region里的垃圾对象复制到另外空闲region里,比如相邻的)
YoungGC:Eden区满了,就会触发G1中的YoungGC,对Eden区进行GC
MixedGC:老年代的占用率达到:-XX:InitiatiatingHeapOccupancyPercent指定的百分比,回收所有的新生代和部分老年代(根据筛选回收阶段你指定的时间进行回收),以及大对象区
FullGC:在MixedGC过程中,采用的复制算法,如果复制过程中内存不够,则会触发FullGC,会STW,并采用单线程标记-整理算法进行GC,相当于用一次Serial GC