《深入理解 Java 虚拟机》学习 -- 垃圾收集器
《深入理解 Java 虚拟机》学习 -- 垃圾收集器
1. Serial 收集器(新生代)
含义:
单线程收集器。
缺点:
进行垃圾收集时,必须暂停其他所有的工作线程。
优点:
简单而高效。
示例:
2. ParNew 收集器(新生代)
含义:
Serial 收集器的多线程版本,使用多条线程进行垃圾收集。
示例:
3. Parallel Scavenge 收集器(新生代)
含义:
Parallel Scavenge 收集器的目标是达到一个可控制的吞吐量。而 CMS 等收集器的关注点则是尽可能地缩短垃圾收集时用户线程的停顿时间。
吞吐量:
吞吐量 = 运行用户代码时间 / (运行用户代码时间 + 垃圾收集时间)
作用:
- 停顿时间越短就越适合需要与用户交互的程序,良好的响应速度能提升用户的体验
- 高吞吐量则可以最高效率地利用 CPU 时间,尽快地完成程序的运算任务,主要使用在后台运算而不需要太多交互的任务。
4. Serial Old 收集器(老年代)
含义:
Serial Old 是 Serial 收集器的老年代版本,它同样是一个单线程收集器,使用”标记 - 整理“ 算法。
示例:
5. Parallel Old 收集器(老年代)
含义:
Parallel Old 是 Parallel Scavenge 收集器的老年代版本,使用多线程和 ”标记 - 整理“ 算法。
示例:
6. CMS 收集器(重要)
含义:
CMS 收集器是一种以获取最短回收停顿时间为目标的收集器。基于 ”标记 - 清除“ 算法。
运行过程
- 初始标记
- 并发标记
- 重新标记
- 并发清除
注意:
- 初始标记,重新标记这两个步骤仍然需要暂停其他所有的工作线程
- 初始标记仅仅只是标记一下 GC Roots 能直接关联到的对象,速度很快
- 并发标记阶段就是进行 GC Roots Tracing 的过程
- 重新标记是为了修正并发标记期间,因用户程序继续运作而导致标记产生变动的那一部分对象的标记记录
优点:
并发收集,低停顿。
缺点:
- CMS 收集器对 CPU 资源非常敏感
- CMS 收集器无法处理浮动垃圾
- 基于 ”标记 - 清除“ 算法标记结束时会产生大量空间碎片
示例:
7. G1 收集器(重要)
含义:
- G1 收集器是基于 ”标记 - 整理" 算法实现的收集器
- G1 收集器可以非常精确地控制停顿
低停顿的原理:
G1 将整个 Java 堆(包括新生代、老年代)划分为多个大小固定的独立区域,并且跟踪这些区域里面的垃圾堆积程度,在后台维护一个优先列表,每次根据允许的收集时间,优先回收垃圾最多的区域。
8. JVM 默认的垃圾收集器
-
jdk1.7 默认垃圾收集器Parallel Scavenge(新生代)+Parallel Old(老年代)
-
jdk1.8 默认垃圾收集器Parallel Scavenge(新生代)+Parallel Old(老年代)
-
jdk1.9 默认垃圾收集器G1
-XX:+PrintCommandLineFlagsjvm
:参数可查看默认设置收集器类型
-XX:+PrintGCDetails
:亦可通过打印的GC日志的新生代、老年代名称判断