G1垃圾回收
G1垃圾回收
文章大部分篇幅粘体自[这可能是最清晰易懂的 G1 GC 资料]
G1 (Garbage-First) 于JDK 6u14版本发布,JDK 7u4版本发行时被正式推出,在JDK9时已经成了默认的垃圾回收器,算是CMS回收器的替代 方案(CMS在JDK9以后已经废弃)
G1是一款分代的 (generational),增量的 (incremental),并行的 (parallel),移动式(evacuating)的,软实时的垃圾回收器。其最大特点是暂停时间可配置,我们可以配置一个最大暂停时间,G1就会尽可能的在回收的同时保证程序的暂停时间在允许范围内,而且在大内存环境下表现更好。
在正式介绍G1 细节之前,先简单说说垃圾回收的一些基本知识:
垃圾回收的一些基础知识
mutator
[ˈmjuːteɪtə] n. 增变基因
在垃圾回收的里,mutator 指应用程序。至于为什么叫这个奇怪的名字?
mutator 是 Edsger Dijkstra 琢磨出来的词,宏观琢磨下来有“改变某物”的意思。说到要改变什么,那就是 GC 对象间的引用关系。不过光这么说可能大家还是不能理解。 其实用一句话概括的话, 它的实体就是“应用程序”。这样说就容易理解了吧。GC 就是在这个 mutator 内部精神饱满地工作着。
Incremental GC (增量垃圾回收)
增量式垃圾回收(Incremental GC)是一种通过逐渐推进垃圾回收来控制mutator 最大暂停时间的方法。
像一些早期的年轻代垃圾回收器,都是完全暂停的,比如Serial GC
简单的说,增量垃圾回收,就是让GC程序和Mutator交替运行的办法,交替执行时,实际上垃圾是一点点回收的,所以叫“增量(Incremental)”
G1就属于一款增量垃圾回收器,它通过和 mutator 交替运行的方式来降低因GC导致的程序暂停时间
并行 GC 和并发 GC
并行GC(Parallel) 和并发(concurrent)GC是垃圾回收里的一个基本概念。这两个词很模糊,容易弄混淆,不过在GC的领域里,就用GC里的解释吧。
一般来说,以多线程执行的 GC 被称为并行/并发 GC ,不过这两个词在GC里意思完全不同。 ==并行的 GC ==会先暂停 mutator,然后开启多个线程并行的执行GC,如下图所示:
而==并发 GC ==是在不暂停 Mutator 运行的同时,开启 GC 线程并行的执行 GC ,如下图所示:
并行GC的目的是提升GC效率,缩短暂停时间,而并发GC的目的是彻底干掉暂停时间
可预测
这里应该有内容
G1 的执行流程
G1 GC 中的堆结构和其他回收器的有所不同,在 G1 中,堆被划分为 N 个大小的相等的区域(Region),每个区域占用一段连续的地址空间,以区域为单位进行垃圾回收,而且这个区域的大小是可配置的。在分配时,如果选择的区域已经满了,会自动寻找下一个空闲的区域来执行分配。