目录
openJDK使用到的垃圾收集器、关注点和概念
垃圾收集器之间组合关系
具体组合如下:
Young | Tenured | JVM options | Description |
---|---|---|---|
Serial | Serial Old | -XX:+UseSerialGC | 单线程进行GC,适合单CPU或小内存,单机程序 |
Serial | CMS+SerialOld | -XX:-UseParNewGC -XX:+UseConcMarkSweepGC | CMS进行GC失败时,会自动使用Serial Old 策略进行GC;JDK8中声明为废弃 |
Parallel Scavenge | Serial Old | -XX:+UseParallelGC | Jdk1.5及之前版本的搭配使用 |
Parallel Scavenge | Parallel Old | -XX:+UseParallelGC -XX:+UseParallelOldGC | 适合多CPU,需要最大吞吐量,如后台计算型应用;是JDK8默认收集器策略 |
Parallel New | Serial Old | -XX:+UseParNewGC | JDK8中声明为废弃 |
Parallel New | CMS+SerialOld | -XX:+UseParNewGC -XX:+UseConcMarkSweepGC | 适合多CPU,追求低停顿时间,需快速响应如互联网应用 |
G1 | -XX:+UseG1GC | JDK9默认收集器 | |
ZGC | -XX:+UseZGC |
垃圾收集算法有:复制算法、标记-清除算法、标记-整理算法。
经典垃圾收集器
- 七种经典垃圾收集器
串行回收器:Serial、Serial Old
并行回收器:ParNew、Parallel Scavenge、Parallel old
并发回收器:CMS、G1
- 垃圾回收器特点总结[1]
垃圾收集器 | 分类 | 作用位置 | 使用算法 | 特点 | 适用场景 | 别名 |
---|---|---|---|---|---|---|
Serial | 串行 | 新生代 | 复制算法 | 响应速度优先 | 适用于单CPU环境下的client模式 | Copy |
ParNew | 并行 | 新生代 | 复制算法 | 响应速度优先 | 多CPU环境Server模式下与CMS配合使用 | ParNew |
Parallel | 并行 | 新生代 | 复制算法 | 吞吐量优先 | 适用于后台运算而不需要太多交互的场景 | PS Scavenge |
Serial Old | 串行 | 老年代 | 标记-整理(压缩)算法 | 响应速度优先 | 适用于单CPU环境下的Client模式 | MarkSweepCompact |
Paraller Old | 并行 | 老年代 | 标记-整理(压缩)算法 | 吞吐量优先 | 适用于后台运算而不需要太多交互的场景 | PS MarkSweep |
CMS | 并发 | 老年代 | 标记-清除算法 | 响应速度优先 | 适用于互联网或B/S业务 | ConcurrentMarkSweep |
G1 | 并发、并行 | 新生代、老年代 | 标记-整理(压缩)算法 | 响应速度优先 | 响应速度优先 | G1 Mixed Generation |
新生代
Serial收集器
- 单线程收集器,使用复制算法
- 它在进行垃圾收集工作的时候必须暂停其他所有的工作线程( "Stop The World" ),直到它收集结束。
ParNew收集器
- 是Serial收集器的多线程版本,使用复制算法
- 它能与 CMS 收集器配合工作。
Parallel Scavenge收集器
- 多线程版本,使用复制算法
- 关注点为吞吐量(高效率的利用CPU),吞吐量就是CPU中用于运行用户代码的时间与CPU总消耗时间的比值。
老年代
Serial Old收集器
- 单线程收集器,使用标记-整理算法
- Serial Old收集器是Serial收集器的老年代版本,是CMS收集器的后备方案
Parallel Old收集器
- 多线程收集器,使用标记-整理算法
- Parallel Old收集器是Parallel Scavenge收集器的老年代版本
CMS收集器
- 多线程收集器,使用标记-清除算法,会导致收集结束时会有大量空间碎片产生
- CMS(Concurrent Mark Sweep)收集器是一种以获取最短回收停顿时间为目标的收集器;关注点:延迟(减少用户线程的停顿时间,提高用户体验)。
- 它是HotSpot虚拟机第一款真正意义上的并发收集器,它第一次实现了让垃圾收集线程与用户线程(基本上)同时工作。
G1收集器
关注点:试图平衡吞吐量和延迟
- 主要调优参数为用户所期望的GC停顿STW时间(-XX:MaxGCPauseMillis指定)来制定回收计划
- 回收算法--复制算法,将一个region中的存活对象复制到另一个region中,几乎不会有太多内存碎片。
ZGC收集器
如何获取使用的默认的垃圾收集器
- 获取 JVM 垃圾收集器的情况,包括使用的哪种垃圾收集器以及回收次数等等。
import java.lang.management.GarbageCollectorMXBean;
import java.lang.management.ManagementFactory;
public class X {
public static void main(String[] args) {
for(GarbageCollectorMXBean b : ManagementFactory.getGarbageCollectorMXBeans()) {
System.out.println(b.getName());
}
}
}
-
-XX:+PrintCommandLineFlags:查看命令行相关参数(包含使用的垃圾收集器)
-
使用命令行指令:jinfo -flag 相关垃圾回收器参数 进程ID
[1] 来源于 https://blog.csdn.net/weixin_46115362/article/details/122383160
[2] 来源于 https://www.cnblogs.com/grey-wolf/p/10222758.html