你是否被JVM的GC停顿困扰过是否好奇Serial、CMS、G1、ZGC到底有什么区别垃圾收集器作为JVM的核心组件直接影响着应用的性能和稳定性。本文将从JVM参数配置讲起深入剖析7大经典垃圾收集器的工作原理、适用场景和优缺点帮你彻底搞懂GC选型与调优 文章目录一、JVM参数配置详解二、垃圾收集器概览三、串行收集器Serial Serial Old四、并行收集器ParNew Parallel Scavenge五、并发收集器CMS六、分区收集器G1七、低延迟神器ZGC八、垃圾收集器选型指南九、常用参数速查表一、JVM参数配置详解1.1 参数类型分类参数类型示例说明标准参数-version,-help所有JVM版本通用-X参数-Xms,-Xmx非标准可能随版本变动-XX参数-XX:UseG1GC调优主要使用的参数1.2 -X参数详解-Xint# 解释执行-Xcomp# 第一次使用就编译成本地代码-Xmixed# 混合模式默认1.3 -XX参数详解Boolean类型格式-XX:[-]name-XX:UseConcMarkSweepGC# 启用CMS-XX:UseG1GC# 启用G1-XX:-UseCompressedOops# 关闭指针压缩非Boolean类型格式-XX:namevalue-XX:MaxGCPauseMillis500-XX:InitialHeapSize100M1.4 常用参数别名-Xms1000M等价于-XX:InitialHeapSize1000M-Xmx1000M等价于-XX:MaxHeapSize1000M-Xss100等价于-XX:ThreadStackSize1001.5 查看参数# 查看所有参数默认值和被修改值java-XX:PrintFlagsFinal-versionflags.txt# 表示默认值# : 表示被用户或JVM修改后的值1.6 设置参数的方式IDE开发工具IDEA、Eclipse的VM Options运行jar包java -XX:UseG1GC xxx.jarWeb容器Tomcat的catalina.sh/batjinfo实时调整仅manageable标记的参数可修改1.7 内存单位换算1 Byte 8 bit 1 KB 1024 Byte 1 MB 1024 KB 1 GB 1024 MB 1 TB 1024 GB示例# 设置堆内存-Xmx100M-Xms100M-XX:PrintFlagsFinal# 查询MaxHeapSize# 输出: 104857600 (字节)# 104857600 / 1024 / 1024 100 MB二、垃圾收集器概览2.1 垃圾收集器分类分类收集器特点适用场景串行收集器Serial、Serial Old单线程STW内存小的嵌入式设备并行收集器ParNew、Parallel Scavenge、Parallel Old多线程并行吞吐量优先科学计算、后台处理并发收集器CMS、G1并发执行停顿时间优先Web应用、对响应时间有要求低延迟收集器ZGC、Shenandoah亚毫秒停顿TB级内存金融、大数据2.2 垃圾收集器发展历程JDK 1.3 ──► Serial Serial Old │ JDK 1.4 ──► ParNew Parallel Scavenge │ JDK 5.0 ──► CMS (里程碑首次并发收集) │ JDK 6 ──► Parallel Old │ JDK 7 ──► G1 (实验性质) │ JDK 8 ──► G1 (成熟) │ JDK 9 ──► G1 (默认GC) │ JDK 11 ──► ZGC (低延迟新时代) │ JDK 15 ──► ZGC (正式版) │ JDK 21 ──► 分代ZGC (未来主流)三、串行收集器Serial Serial Old3.1 Serial收集器特点最基本、发展历史最悠久的收集器单线程收集器只有一个GC线程STWStop The World收集时暂停所有用户线程收集算法复制算法适用新生代应用场景Client模式下的默认新生代收集器优点简单高效单线程收集效率高 缺点收集过程需要暂停所有线程3.2 Serial Old收集器Serial Old是Serial的老年代版本同样是单线程采用标记-整理算法。四、并行收集器ParNew Parallel Scavenge4.1 ParNew收集器特点Serial收集器的多线程版本多个GC线程并行执行收集算法复制算法适用新生代应用场景Server模式下首选的新生代收集器优点多CPU时效率比Serial高 缺点单CPU时效率比Serial差仍需要STW4.2 Parallel Scavenge收集器特点新生代并行收集器使用复制算法更关注吞吐量吞吐量公式吞吐量 运行用户代码时间 / (运行用户代码时间 垃圾收集时间)示例虚拟机运行100分钟垃圾收集1分钟 吞吐量 (100-1)/100 99%关键参数-XX:MaxGCPauseMillis# 控制最大垃圾收集停顿时间-XX:GCTimeRatio# 直接设置吞吐量大小4.3 Parallel Old收集器Parallel Old是Parallel Scavenge的老年代版本采用标记-整理算法同样关注吞吐量。五、并发收集器CMS官网https://docs.oracle.com/javase/8/docs/technotes/guides/vm/gctuning/cms.html5.1 CMS特点CMSConcurrent Mark Sweep收集器是一种以获取最短回收停顿时间为目标的收集器。5.2 CMS回收流程采用标记-清除算法整个过程分为4步阶段名称说明是否STW1初始标记标记GC Roots直接关联对象是很短2并发标记进行GC Roots Tracing否3重新标记修改并发标记期间变动的内容是较短4并发清除清除不可达对象否优点并发收集、低停顿 缺点产生大量空间碎片、并发阶段会降低吞吐量5.3 CMS常见问题浮动垃圾并发清理时产生的新垃圾需下次清理Concurrent Mode Failure并发失败退化为Full GC内存碎片标记-清除算法导致六、分区收集器G1官网https://docs.oracle.com/javase/8/docs/technotes/guides/vm/gctuning/g1_gc.html6.1 G1特点G1Garbage-First收集器是分区化的垃圾收集器将整个Java堆划分为多个Region大小相等1M~32M2的幂次新生代和老年代不再是物理隔离都是Region的集合大对象直接放入Humongous RegionH区6.2 G1核心优势1分代收集保留分代概念 2空间整合整体上标记-整理无空间碎片 3可预测的停顿指定M毫秒内GC时间不超过N毫秒6.3 G1回收流程阶段名称说明是否STW1初始标记标记GC Roots关联对象修改TAMS是2并发标记从GC Roots进行可达性分析否3最终标记修正并发标记期间变动的数据是4筛选回收对Region排序制定回收计划是6.4 G1的Remembered SetRSetRSet记录了哪些Region引用了当前Region的对象避免全堆扫描。结构类似Hash表 KeyRegion地址 Value引用该对象的集合6.5 G1关键参数-XX:UseG1GC# 启用G1-XX:G1HeapRegionSize16M# 设置Region大小-XX:MaxGCPauseMillis200# 最大停顿时间-XX:InitiatingHeapOccupancyPercent45# 触发并发GC的堆占用率-XX:G1HeapWastePercent10# 可回收空间小于10%不触发Mixed GC七、低延迟神器ZGC官网https://docs.oracle.com/en/java/javase/11/gctuning/z-garbage-collector1.html7.1 ZGC特点不分代物理和逻辑上都没有新老年代概念Page管理分为一个个pageGC时压缩无碎片亚毫秒停顿10ms超大内存支持TB级别JDK 15支持16TB7.2 ZGC核心优势1停顿时间10ms 2支持TB级内存 3停顿时间不随堆大小增加而增加八、垃圾收集器选型指南8.1 选型决策树内存大小 │ ├─ 100M → Serial │ └─ 100M → CPU核数 │ ├─ 单核 → Serial │ └─ 多核 → 停顿时间要求 │ ├─ 1秒 → Parallel │ └─ 1秒 → 并发收集器 │ ├─ JDK 9 → CMS │ └─ JDK 9 → G1/ZGC8.2 官方选型建议场景推荐收集器内存100M串行收集器单核无停顿要求串行或JVM自选允许停顿1秒并行或JVM自选响应时间最重要停顿1秒并发收集器CMS/G18.3 G1使用条件150%以上的堆被存活对象占用 2对象分配和晋升速度变化非常大 3垃圾回收时间比较长九、常用参数速查表9.1 内存设置参数参数含义简写-XX:InitialHeapSize100M初始化堆大小-Xms100M-XX:MaxHeapSize100M最大堆大小-Xmx100M-XX:NewSize20M年轻代大小--XX:MaxNewSize50M年轻代最大大小--XX:OldSize50M老年代大小--XX:MetaspaceSize50M元空间大小--XX:MaxMetaspaceSize50M元空间最大大小--Xss128k线程堆栈大小-9.2 GC收集器参数参数说明-XX:UseSerialGC使用Serial收集器-XX:UseParallelGC使用Parallel Scavenge-XX:UseParallelOldGC使用Parallel Old-XX:UseConcMarkSweepGC使用CMS-XX:UseG1GC使用G1-XX:UseZGC使用ZGC9.3 GC调优参数参数说明默认值-XX:NewRatio2新老年代比值老:新2:12-XX:SurvivorRatio8Eden:S0:S1 8:1:18-XX:MaxTenuringThreshold15晋升老年代年龄15-XX:MaxGCPauseMillis200最大GC停顿时间200-XX:InitiatingHeapOccupancyPercent45触发并发GC的堆占用率45-XX:HeapDumpOnOutOfMemoryErrorOOM时生成堆转储--XX:HeapDumpPath/path/to/dump堆转储文件路径-9.4 G1专用参数参数说明默认值-XX:G1HeapRegionSize1MRegion大小1~32M自动计算-XX:G1HeapWastePercent10可回收空间10%不触发Mixed GC10-XX:G1MixedGCLiveThresholdPercent65Old Region准入CSet阈值65-XX:G1MixedGCCountTarget8Mixed GC目标次数8-XX:G1OldCSetRegionThresholdPercent10Old Region加入CSet比例上限109.5 启用指定收集器# 串行收集器-XX:UseSerialGC-XX:UseSerialOldGC# 并行收集器吞吐量优先-XX:UseParallelGC-XX:UseParallelOldGC# 并发收集器响应时间优先-XX:UseConcMarkSweepGC-XX:UseG1GC# 低延迟收集器-XX:UseZGC总结核心知识点收集器算法适用代特点适用场景Serial复制新生代单线程、简单高效Client模式ParNew复制新生代多线程并行Server模式新生代Parallel Scavenge复制新生代吞吐量优先后台计算Serial Old标记-整理老年代单线程配合SerialParallel Old标记-整理老年代吞吐量优先配合Parallel ScavengeCMS标记-清除老年代低停顿、并发收集Web应用G1标记-整理复制整堆可预测停顿、分区管理大内存应用ZGC标记-复制整堆亚毫秒停顿、TB内存金融、大数据吞吐量 vs 停顿时间吞吐量优先高吞吐量可充分利用CPU适合后台运算停顿时间优先良好的响应速度提升用户体验适合Web应用平衡选择在可接受的停顿时间范围内尽可能提高吞吐量关键词JVM垃圾收集器, Serial, ParNew, CMS, G1, ZGC, 垃圾回收, JVM调优, GC参数, 吞吐量, 停顿时间如果本文对你有帮助欢迎点赞、收藏、关注有任何JVM调优问题欢迎在评论区留言讨论。
JVM垃圾收集器全解析:从Serial到ZGC的完整进化史
你是否被JVM的GC停顿困扰过是否好奇Serial、CMS、G1、ZGC到底有什么区别垃圾收集器作为JVM的核心组件直接影响着应用的性能和稳定性。本文将从JVM参数配置讲起深入剖析7大经典垃圾收集器的工作原理、适用场景和优缺点帮你彻底搞懂GC选型与调优 文章目录一、JVM参数配置详解二、垃圾收集器概览三、串行收集器Serial Serial Old四、并行收集器ParNew Parallel Scavenge五、并发收集器CMS六、分区收集器G1七、低延迟神器ZGC八、垃圾收集器选型指南九、常用参数速查表一、JVM参数配置详解1.1 参数类型分类参数类型示例说明标准参数-version,-help所有JVM版本通用-X参数-Xms,-Xmx非标准可能随版本变动-XX参数-XX:UseG1GC调优主要使用的参数1.2 -X参数详解-Xint# 解释执行-Xcomp# 第一次使用就编译成本地代码-Xmixed# 混合模式默认1.3 -XX参数详解Boolean类型格式-XX:[-]name-XX:UseConcMarkSweepGC# 启用CMS-XX:UseG1GC# 启用G1-XX:-UseCompressedOops# 关闭指针压缩非Boolean类型格式-XX:namevalue-XX:MaxGCPauseMillis500-XX:InitialHeapSize100M1.4 常用参数别名-Xms1000M等价于-XX:InitialHeapSize1000M-Xmx1000M等价于-XX:MaxHeapSize1000M-Xss100等价于-XX:ThreadStackSize1001.5 查看参数# 查看所有参数默认值和被修改值java-XX:PrintFlagsFinal-versionflags.txt# 表示默认值# : 表示被用户或JVM修改后的值1.6 设置参数的方式IDE开发工具IDEA、Eclipse的VM Options运行jar包java -XX:UseG1GC xxx.jarWeb容器Tomcat的catalina.sh/batjinfo实时调整仅manageable标记的参数可修改1.7 内存单位换算1 Byte 8 bit 1 KB 1024 Byte 1 MB 1024 KB 1 GB 1024 MB 1 TB 1024 GB示例# 设置堆内存-Xmx100M-Xms100M-XX:PrintFlagsFinal# 查询MaxHeapSize# 输出: 104857600 (字节)# 104857600 / 1024 / 1024 100 MB二、垃圾收集器概览2.1 垃圾收集器分类分类收集器特点适用场景串行收集器Serial、Serial Old单线程STW内存小的嵌入式设备并行收集器ParNew、Parallel Scavenge、Parallel Old多线程并行吞吐量优先科学计算、后台处理并发收集器CMS、G1并发执行停顿时间优先Web应用、对响应时间有要求低延迟收集器ZGC、Shenandoah亚毫秒停顿TB级内存金融、大数据2.2 垃圾收集器发展历程JDK 1.3 ──► Serial Serial Old │ JDK 1.4 ──► ParNew Parallel Scavenge │ JDK 5.0 ──► CMS (里程碑首次并发收集) │ JDK 6 ──► Parallel Old │ JDK 7 ──► G1 (实验性质) │ JDK 8 ──► G1 (成熟) │ JDK 9 ──► G1 (默认GC) │ JDK 11 ──► ZGC (低延迟新时代) │ JDK 15 ──► ZGC (正式版) │ JDK 21 ──► 分代ZGC (未来主流)三、串行收集器Serial Serial Old3.1 Serial收集器特点最基本、发展历史最悠久的收集器单线程收集器只有一个GC线程STWStop The World收集时暂停所有用户线程收集算法复制算法适用新生代应用场景Client模式下的默认新生代收集器优点简单高效单线程收集效率高 缺点收集过程需要暂停所有线程3.2 Serial Old收集器Serial Old是Serial的老年代版本同样是单线程采用标记-整理算法。四、并行收集器ParNew Parallel Scavenge4.1 ParNew收集器特点Serial收集器的多线程版本多个GC线程并行执行收集算法复制算法适用新生代应用场景Server模式下首选的新生代收集器优点多CPU时效率比Serial高 缺点单CPU时效率比Serial差仍需要STW4.2 Parallel Scavenge收集器特点新生代并行收集器使用复制算法更关注吞吐量吞吐量公式吞吐量 运行用户代码时间 / (运行用户代码时间 垃圾收集时间)示例虚拟机运行100分钟垃圾收集1分钟 吞吐量 (100-1)/100 99%关键参数-XX:MaxGCPauseMillis# 控制最大垃圾收集停顿时间-XX:GCTimeRatio# 直接设置吞吐量大小4.3 Parallel Old收集器Parallel Old是Parallel Scavenge的老年代版本采用标记-整理算法同样关注吞吐量。五、并发收集器CMS官网https://docs.oracle.com/javase/8/docs/technotes/guides/vm/gctuning/cms.html5.1 CMS特点CMSConcurrent Mark Sweep收集器是一种以获取最短回收停顿时间为目标的收集器。5.2 CMS回收流程采用标记-清除算法整个过程分为4步阶段名称说明是否STW1初始标记标记GC Roots直接关联对象是很短2并发标记进行GC Roots Tracing否3重新标记修改并发标记期间变动的内容是较短4并发清除清除不可达对象否优点并发收集、低停顿 缺点产生大量空间碎片、并发阶段会降低吞吐量5.3 CMS常见问题浮动垃圾并发清理时产生的新垃圾需下次清理Concurrent Mode Failure并发失败退化为Full GC内存碎片标记-清除算法导致六、分区收集器G1官网https://docs.oracle.com/javase/8/docs/technotes/guides/vm/gctuning/g1_gc.html6.1 G1特点G1Garbage-First收集器是分区化的垃圾收集器将整个Java堆划分为多个Region大小相等1M~32M2的幂次新生代和老年代不再是物理隔离都是Region的集合大对象直接放入Humongous RegionH区6.2 G1核心优势1分代收集保留分代概念 2空间整合整体上标记-整理无空间碎片 3可预测的停顿指定M毫秒内GC时间不超过N毫秒6.3 G1回收流程阶段名称说明是否STW1初始标记标记GC Roots关联对象修改TAMS是2并发标记从GC Roots进行可达性分析否3最终标记修正并发标记期间变动的数据是4筛选回收对Region排序制定回收计划是6.4 G1的Remembered SetRSetRSet记录了哪些Region引用了当前Region的对象避免全堆扫描。结构类似Hash表 KeyRegion地址 Value引用该对象的集合6.5 G1关键参数-XX:UseG1GC# 启用G1-XX:G1HeapRegionSize16M# 设置Region大小-XX:MaxGCPauseMillis200# 最大停顿时间-XX:InitiatingHeapOccupancyPercent45# 触发并发GC的堆占用率-XX:G1HeapWastePercent10# 可回收空间小于10%不触发Mixed GC七、低延迟神器ZGC官网https://docs.oracle.com/en/java/javase/11/gctuning/z-garbage-collector1.html7.1 ZGC特点不分代物理和逻辑上都没有新老年代概念Page管理分为一个个pageGC时压缩无碎片亚毫秒停顿10ms超大内存支持TB级别JDK 15支持16TB7.2 ZGC核心优势1停顿时间10ms 2支持TB级内存 3停顿时间不随堆大小增加而增加八、垃圾收集器选型指南8.1 选型决策树内存大小 │ ├─ 100M → Serial │ └─ 100M → CPU核数 │ ├─ 单核 → Serial │ └─ 多核 → 停顿时间要求 │ ├─ 1秒 → Parallel │ └─ 1秒 → 并发收集器 │ ├─ JDK 9 → CMS │ └─ JDK 9 → G1/ZGC8.2 官方选型建议场景推荐收集器内存100M串行收集器单核无停顿要求串行或JVM自选允许停顿1秒并行或JVM自选响应时间最重要停顿1秒并发收集器CMS/G18.3 G1使用条件150%以上的堆被存活对象占用 2对象分配和晋升速度变化非常大 3垃圾回收时间比较长九、常用参数速查表9.1 内存设置参数参数含义简写-XX:InitialHeapSize100M初始化堆大小-Xms100M-XX:MaxHeapSize100M最大堆大小-Xmx100M-XX:NewSize20M年轻代大小--XX:MaxNewSize50M年轻代最大大小--XX:OldSize50M老年代大小--XX:MetaspaceSize50M元空间大小--XX:MaxMetaspaceSize50M元空间最大大小--Xss128k线程堆栈大小-9.2 GC收集器参数参数说明-XX:UseSerialGC使用Serial收集器-XX:UseParallelGC使用Parallel Scavenge-XX:UseParallelOldGC使用Parallel Old-XX:UseConcMarkSweepGC使用CMS-XX:UseG1GC使用G1-XX:UseZGC使用ZGC9.3 GC调优参数参数说明默认值-XX:NewRatio2新老年代比值老:新2:12-XX:SurvivorRatio8Eden:S0:S1 8:1:18-XX:MaxTenuringThreshold15晋升老年代年龄15-XX:MaxGCPauseMillis200最大GC停顿时间200-XX:InitiatingHeapOccupancyPercent45触发并发GC的堆占用率45-XX:HeapDumpOnOutOfMemoryErrorOOM时生成堆转储--XX:HeapDumpPath/path/to/dump堆转储文件路径-9.4 G1专用参数参数说明默认值-XX:G1HeapRegionSize1MRegion大小1~32M自动计算-XX:G1HeapWastePercent10可回收空间10%不触发Mixed GC10-XX:G1MixedGCLiveThresholdPercent65Old Region准入CSet阈值65-XX:G1MixedGCCountTarget8Mixed GC目标次数8-XX:G1OldCSetRegionThresholdPercent10Old Region加入CSet比例上限109.5 启用指定收集器# 串行收集器-XX:UseSerialGC-XX:UseSerialOldGC# 并行收集器吞吐量优先-XX:UseParallelGC-XX:UseParallelOldGC# 并发收集器响应时间优先-XX:UseConcMarkSweepGC-XX:UseG1GC# 低延迟收集器-XX:UseZGC总结核心知识点收集器算法适用代特点适用场景Serial复制新生代单线程、简单高效Client模式ParNew复制新生代多线程并行Server模式新生代Parallel Scavenge复制新生代吞吐量优先后台计算Serial Old标记-整理老年代单线程配合SerialParallel Old标记-整理老年代吞吐量优先配合Parallel ScavengeCMS标记-清除老年代低停顿、并发收集Web应用G1标记-整理复制整堆可预测停顿、分区管理大内存应用ZGC标记-复制整堆亚毫秒停顿、TB内存金融、大数据吞吐量 vs 停顿时间吞吐量优先高吞吐量可充分利用CPU适合后台运算停顿时间优先良好的响应速度提升用户体验适合Web应用平衡选择在可接受的停顿时间范围内尽可能提高吞吐量关键词JVM垃圾收集器, Serial, ParNew, CMS, G1, ZGC, 垃圾回收, JVM调优, GC参数, 吞吐量, 停顿时间如果本文对你有帮助欢迎点赞、收藏、关注有任何JVM调优问题欢迎在评论区留言讨论。