> 文章列表 > JVM的GC

JVM的GC

JVM的GC

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