GC
年轻代 | 老年代 | 参数 |
---|---|---|
Serial | Serial Old | -XX:+UseSerialGC |
Parallel Scavenge | Parallel Old | -XX:+UseParallelGC -XX:+UseParallelOldGC |
Parallel New | CMS | -XX:+UseParNewGC -XX:+UseConcMarkSweepGC |
G1 | G1 | -XX:+UseG1GC |
ZGC | ZGC | -XX:+UseZGC |
GC | 串并行发 | 作用位置 | 算法 | 特点 | 场景 |
---|---|---|---|---|---|
Serial | 串行 | 新生代 | 复制算法 | 响应速度 | 单CPU环境下client模式 |
Parallel New | 并行 | 新生代 | 复制算法 | 响应速度 | 多CPU环境下Server模式下与CMS配合使用 |
Parallel Scavenge | 并行 | 新生代 | 复制算法 | 吞吐量 | 多运算,少IO |
Serial Old | 串行 | 老年代 | 标记-整理 | 响应速度 | 单CPU环境下client模式 |
Parallel Old | 并行 | 老年代 | 标记-整理 | 吞吐量 | 多运算,少IO |
CMS | 并发 | 老年代 | 标记-清除 | 响应速度 | B/S业务 |
G1 | 并发,并行 | 新生代,老年代 | 复制算法、标记-整理 | 响应速度 | 服务端应用 |
ZGC | 新生代,老年代 | 复制算法 | 服务端应用 |
CMS (Concurrent Mark Sweep)
参考
- 目标:适合于B/S等对响应时间要求高的场景
- jdk1.4后期版本开始引入的新gc算法
- ParNew(新生代) + CMS(老年代)组合使用
- 使用标记-清除算法
- 缺点:运行结束产生大量空间碎片
- 缺点:由于分配给用户使用的老年代空间不足造成可能出现“Concurrent Mode Failure”
G1
参考
- 目标:适应不断扩大的内存和不断增加的处理器数量,进一步降低暂停时间,同时兼顾良好的吞吐量
- JDK 7u4发行版时被正式推出
- 区域:新生代和老年代
- 使用标记整理算法,不会产生空间碎片
- soft real-time(软实时)
- Region-card(内存模型)
- 分代收集算法
- 三色标记法
ZGC
参考
- jdk11开始引入,最好在jdk17中使用
- 停顿时间更短。停顿时间不超过10ms,停顿时间不会随着堆的大小,或者活跃对象的大小而增加
- 支持更大的堆。支持8MB~4TB级别的堆(未来支持16TB)
- 转移阶段并发。转移阶段也是并发执行的,ZGC几乎所有暂停都只依赖于GC Roots集合大小,停顿时间不会随着堆的大小或者活跃对象的大小而增加。与ZGC对比,G1的转移阶段完全STW的,且停顿时间随存活对象的大小增加而增加。
jdk与GC
jdk各个版本默认GC
# 打印默认参数,包括GC参数
java -XX:+PrintCommandLineFlags -version
jdk版本 | 默认GC | 新生代 | 老年代 | 默认参数 |
---|---|---|---|---|
jdk8 | Parallel Scavenge + Parallel Old | Parallel Scavenge | Parallel Old | -XX:+UseParallelGC |
jdk11 | G1 | G1 | G1 | -XX:+UseG1GC |
jdk17 | G1 | G1 | G1 | -XX:+UseG1GC |
jdk21 | `` |
jvm参数对应gc
参数 | 代表GC |
---|---|
-XX:-UseSerialGC | Serial + Serial Old |
-XX:-UseParNewGC | ParNew + Serial Old |
-XX:-UseParallelGC | Parallel Scavenge + Parallel Old |
-XX:-UseParallelOldGC | Parallel Scavenge + Parallel Old |
-XX:-UseConcMarkSweepGC | CMS + ParNew |
-XX:-UseG1GC | G1 |
-XX:+UseZGC | ZGC |