文章目录
简介
- 官方给G1设定的目标是:在延迟可控的情况下获得尽可能高的吞吐量,开创了收集器面向局部收集的设计思路和基于Region的内存布局形式
- G1 (Garbage- First)是一款面向服务端应用的垃圾收集器,主要针对配备多核CPU及大容量内存的机器,以极高概率满足GC停顿时间的同时,还兼具高吞吐量的性能特征
- 在JDK1.7版本正式启用,移除了Experimental的标识,是JDK 9以后的默认垃圾回收器,取代了CMS回收器以及Parallel + Parallel Old组合。被Oracle官方称为“全功能的垃圾收集器”
- CMS已经在JDK 9中被标记为废弃(deprecated)。在jdk8中还不是默认的垃圾回收器,需要使用-XX: +UseG1GC来启用
- 复制算法+标记-压缩算法、并发+并行回收和"Stop-the-world"机制
为什么叫做Garbage First(G1)?
-
G1是一个并行回收器,它把堆内存分割为很多不相关的区域(Region) (物理上不连续的)。使用不同的Region来表示Eden、幸存者0区,幸存者1区,老年代等
-
G1 GC有计划地避免在整个Java堆中进行全区域的垃圾收集。G1跟踪各个Region里面的垃圾收集的价值大小(回收所获得的空间大小以及回收所需时间的经验值),在后台维护一个优先列表,每次根据允许的收集时间,优先回收价值最大的Region
-
由于这种方式的侧重点在于回收垃圾最大量的区间(Region) ,所以给G1一个名字:垃圾优先(Garbage First)
G1回收器的特点
优势
-
- 并行与并发
- 并行性:G1在回收期间,可以有多个GC线程同时工作,有效利用多核计算能力。此时用户线程STW(只要是并行回收就一定会STW)
- 并发性:G1拥有与应用程序交替执行的能力,部分工作可以和应用程序同时执行,因此,一般来说,不会在整个回收阶段发生完全阻塞应用程序的情况
-
- 分代收集
- 从分代上看,G1依然属于分代型垃圾回收器