jdk1.7 默认垃圾收集器Parallel Scavenge(新生代)+Parallel Old(老年代)
jdk1.8 默认垃圾收集器Parallel Scavenge(新生代)+Parallel Old(老年代)
jdk1.9 默认垃圾收集器G1
1GC分类
串行回收器:Serial、Serial Old
并行回收器:ParNew、 Parallel Scavenge 、Parallel Old
并发回收器:CMS、G1
分类标椎 | 描述 |
---|---|
按线程数分 | 分为串行垃圾回收器和并行垃圾回收器。串行垃圾回收器次一只使用一个线程进行垃圾回收;并行垃圾回收器一次将开启 |
多个线程同时进行垃圾回收。在并行能力较强的CPU上,使用并行垃圾回收器可以缩短GC的停顿时间。 | |
按工作模式分 | 分为并发式垃圾回收器和独占式垃圾回收器。并发式垃圾回收器与应用程序线程交替工作,以尽可能减少应用程序的停顿 |
时间;独占式垃圾回收器(Stop the world) 一旦运行,就停止应用程序中的其他所有线程,直到垃圾回收过程完全结束。 | |
按碎片整理方式分 | 分为压缩式垃圾回收器和非压缩式垃圾回收器。压缩式垃圾回收器会在回收完成后,对存活对象进行压缩整理,消除回收 |
后的碎片【指针碰撞】;非压缩式的垃圾回收器不进行这步操作【空闲列表】。 | |
按工作的内存空间分 | 年轻代回收器和老年代回收器 |
2Serial&&Serial Old回收器:串行回收
jdk1.3回收年轻代的唯一选择。Serial 回收器是最基本的 新生代
垃圾回收器,是 单线程
的垃圾回收器。由于垃圾清理时,Serial 回收器 不存在 线程间的切换
,因此,特别是在单 CPU 的环境下,它的 垃圾清除效率 比较高。对于 Client
运行模式的程序,选择 Serial 回收器是一个不错的选择。Serial 新生代回收器 采用的是 复制
算法。
Serial Old 回收器是 Serial 回收器的 老年代
版本,属于 单线程
回收器,它使用 标记-整理
算法。对于 Server
模式下的虚拟机,在 JDK1.5
及其以前,它常与 Parallel Scavenge
回收器配合使用,达到较好的 吞吐量,另外它也是 CMS
回收器在 Concurrent Mode Failure 时的 后备方案。
3ParNew回收器:并行回收
ParNew 回收器是在 Serial 回收器的基础上演化而来的,属于 Serial 回收器的 多线程
版本,同样运行在 新生代
区域。在不同运行环境下,根据 CPU 核数,开启 不同的线程数,从而达到 最优 的垃圾回收效果。对于那些 Server
模式的应用程序,如果考虑采用 CMS
作为 老生代回收器 时,ParNew 回收器是一个不错的选择。ParNew 新生代回收器 采用的是 复制算法。
注意:在单个CPU环境下,ParNew收集器不比Serial收集器高效。目前除了Serial可以与CMS配合工作,只有ParNew可以了。
4Parallel回收器:吞吐量优先
Parallel Scavenge 回收器也是运行在 新生代
区域,属于 多线程
的回收器。但不同的是,ParNew 回收器是通过控制 垃圾回收 的 线程数 来进行参数调整,而 Parallel Scavenge 回收器更关心的是 程序运行的吞吐量
。即一段时间内,用户代码 运行时间占 总运行时间 的百分比。Parallel Scavenge 新生代回收器 采用的是 复制
算法。
JDK1.6:Parallel Old 回收器是 Parallel Scavenge 回收器的 老生代版本,属于 多线程
回收器,采用 标记-整理
算法。Parallel Old 回收器和 Parallel Scavenge 回收器同样考虑了 吞吐量优先 这一指标,非常适合那些 注重吞吐量 和 CPU 资源敏感 的场合。
5CMS回收器:低延迟
JDK1.5 第一款真正意义上的并发收集器,它第一次实现了让垃圾回收线程与用户线程同时工作,并且也会STW。CMS(Concurrent Mark Sweep) 回收器是在 最短回收停顿时间
为前提的回收器,属于 多线程回收器
,采用 标记-清除
算法。作为老年代的垃圾回收器。
1 工作过程
1 初始标记(CMS initial mark):初始标记 仅仅是标记 GC Roots 内 直接关联 的对象。这个阶段 速度很快,需要 Stop the World。
2 并发标记(CMS concurrent mark):从GC Roots直接关联到的对象 开始对堆进行 可达性分析,找出 存活对象,这个耗时比较长,但是不需要停顿用户线程,可以与垃圾回收线程一起并发执行。
3 重新标记(CMS remark):重新标记 阶段为了 修正 并发期间由于 用户进行运作 导致的 标记变动 的那一部分对象的 标记记录。这个阶段的 停顿时间 一般会比 初始标记阶段 稍长一些,但远比 并发标记 的时间短,也需要 Stop The World。
4 并发清除(CMS concurrent sweep):并发清除 阶段会清除垃圾对象。
初始标记(CMS initial mark)和 重新标记(CMS remark)会导致 用户线程 卡顿,Stop the World 现象发生。
2 CMS 回收器的缺点:
1、 CMS回收器对CPU资源非常依赖:CMS 回收器过分依赖于 多线程环境,默认情况下,开启的 线程数 为(CPU 的数量 + 3)/ 4,当 CPU 数量少于 4 个时,CMS 对 用户查询 的影响将会很大,因为他们要分出一半的运算能力去 执行回收器线程;
2、 CMS回收器无法清除浮动垃圾:由于 CMS 回收器 清除已标记的垃圾 (处于最后一个阶段)时,用户线程 还在运行,因此会有新的垃圾产生。但是这部分垃圾 未被标记,在下一次 GC 才能清除,因此被成为 浮动垃圾。
由于 内存回收 和 用户线程 是同时进行的,内存在被 回收 的同时,也在被 分配:当 老生代 中的内存使用超过一定的比例时,系统将会进行 垃圾回收,当 剩余内存 不能满足程序运行要求时,系统将会出现 Concurrent Mode Failure,临时采用 Serial Old 算法进行 清除,此时的 性能 将会降低。
3 、垃圾收集结束后残余大量空间碎片:CMS 回收器采用的 标记清除算法,本身存在垃圾收集结束后残余 大量空间碎片 的缺点。CMS 配合适当的 内存整理策略,在一定程度上可以解决这个问题。
6G1回收器:区域分代化
G1 是 JDK 1.7 中正式投入使用的用于取代 CMS 的 压缩回收器。它虽然没有在物理上隔断 新生代 与 老生代,但是仍然属于 分代垃圾回收器。G1 仍然会区分 年轻代 与 老年代,年轻代依然分有 Eden 区与 Survivor 区。
G1 首先将 堆 分为 大小相等 的 Region,避免 全区域 的垃圾回收。然后追踪每个 Region 垃圾 堆积的价值大小,在后台维护一个 优先列表,根据允许的回收时间优先回收价值最大的 Region。同时 G1采用 Remembered Set 来存放 Region 之间的 对象引用 ,从而避免 全堆扫描。G1 的分区示例如下图所示:
这种使用 Region 划分 内存空间 以及有 优先级 的区域回收方式,保证 G1 回收器在有限的时间内可以获得尽可能 高的回收效率。
1 整个过程也分为 4 个步骤:
1、初始标记(CMS initial mark):初始标记 仅仅是标记 GC Roots 内 直接关联 的对象。这个阶段 速度很快,需要 Stop the World。
2、并发标记(CMS concurrent mark):从GC Roots直接关联到的对象 开始对堆进行 可达性分析,找出 存活对象,这个耗时比较长,但是不需要停顿用户线程,可以与垃圾回收线程一起并发执行。
3、重新标记(CMS remark):重新标记 阶段为了 修正 并发期间由于 用户进行运作 导致的 标记变动 的那一部分对象的 标记记录。这个阶段的 停顿时间 一般会比 初始标记阶段 稍长一些,但远比 并发标记 的时间短,也需要 Stop The World。
4、筛选回收:首先对各个 Region 的 回收价值 和 成本 进行排序,根据用户所期望的 GC 停顿时间 来制定回收计划。这个阶段可以与用户程序一起 并发执行,但是因为只回收一部分 Region,时间是用户可控制的,而且停顿 用户线程 将大幅提高回收效率。
2 G1 具备如下 4 个优势:
1、并行与并发:使用多个 CPU 来缩短 Stop-the-World 的 停顿时间,部分其他回收器需要停顿 Java 线程执行的 GC 动作,G1 回收器仍然可以通过 并发的方式 让 Java 程序继续执行。
2、分代回收:与其他回收器一样,分代概念 在 G1 中依然得以保留。虽然 G1 可以不需要 其他回收器配合 就能独立管理 整个GC堆,但它能够采用 不同的策略 去处理 新创建的对象 和 已经存活 一段时间、熬过多次 GC 的旧对象,以获取更好的回收效果。新生代 和 老年代 不再是 物理隔离,是多个 大小相等 的独立 Region。
3、空间整合:与 CMS 的 标记—清理 算法不同,G1 从 整体 来看是基于 标记—整理 算法实现的回收器。从 局部(两个 Region 之间)上来看是基于 复制算法 实现的。但无论如何,这 两种算法 都意味着 G1 运作期间 不会产生内存空间碎片,回收后能提供规整的可用内存。这种特性有利于程序长时间运行,分配大对象 时不会因为无法找到 连续内存空间 而提前触发 下一次 GC。
4、可预测的停顿:这是 G1 相对于 CMS 的另一大优势,降低停顿时间 是 G1 和 CMS 共同的关注点。G1 除了追求 低停顿 外,还能建立 可预测 的 停顿时间模型,能让使用者明确指定在一个 长度 为 M 毫秒的 时间片段 内,消耗在 垃圾回收 上的时间不得超过 N 毫秒。(后台维护的 优先列表,优先回收 价值大 的 Region)。