JVM垃圾回收器Serial、ParNew、Parallel Scavenge 与 Parallel Old

JVM垃圾回收器:Serial、ParNew、Parallel Scavenge 与 Parallel Old

在 Java 虚拟机(JVM)的内存管理中,垃圾回收(Garbage Collection, GC)是自动内存管理的核心机制。选择合适的垃圾回收器对应用程序的性能有着至关重要的影响。

尽管 G1、ZGC、Shenandoah 等新一代回收器已在 JDK 新版本中成为主流,但在大量遗留系统、嵌入式设备或特定场景下,四种经典回收器——Serial、ParNew、Parallel Scavenge 和 Parallel Old依然具有不可替代的价值。

本文将系统性地介绍这四大回收器的工作原理、核心特性、适用场景、配置参数及调优策略,帮助开发者精准选型,提升应用性能。


1. 串行回收器(Serial Collector)

1.1 概述

串行回收器是 JVM 中最古老、最简单的垃圾回收器,诞生于 Java 早期版本。它采用单线程执行所有 GC 工作,适用于资源受限或对响应时间要求不高的环境。

1.2 工作模式

1.2.1 新生代串行回收器(Serial)
  • 回收算法:复制算法(Copying)
  • 工作线程:单线程
  • 关键特点
    • 采用Stop-The-World(STW)机制,GC 期间所有应用线程暂停。
    • 内存分配使用指针碰撞(Bump the Pointer)技术,高效且无锁。
    • 实现简单,额外内存开销最小(无需维护多线程状态或并发数据结构)。
  • 适用场景
    • 客户端应用(如桌面软件、IDE 插件)
    • 堆内存较小(几十 MB 到 200MB)
    • 单核 CPU 或低功耗设备(如 IoT 设备)
1.2.2 老年代串行回收器(Serial Old)
  • 回收算法:标记-整理算法(Mark-Compact)
  • 工作线程:单线程
  • 工作流程
    1. 标记阶段:遍历对象图,标记所有存活对象。
    2. 整理阶段:将存活对象向一端移动,消除内存碎片。
  • 特点
    • 同样采用 STW 机制。
    • 由于老年代对象存活率高,整理过程耗时较长。
  • 组合使用:通常与新生代 Serial 配合,形成完整的串行回收方案。

1.3 启用参数

# 启用串行垃圾回收器(新生代 + 老年代)-XX:+UseSerialGC

✅ 该参数会同时启用Serial(新生代)和Serial Old(老年代)。

1.4 优缺点分析

优点缺点
实现简单,稳定性高暂停时间长,用户体验差
内存开销最小无法利用多核 CPU 并行能力
适合单核环境不适用于高并发或实时系统

2. 新生代并行回收器(ParNew)

2.1 概述

ParNew 是Serial 收集器的多线程并行版本,专为新生代设计。其核心思想是:在多核 CPU 上,并行执行 GC 以缩短 STW 时间

📌 注意:ParNew 仅作用于新生代,老年代需搭配其他回收器(如 CMS 或 Serial Old)。

2.2 核心特性

  • 多线程并行回收:使用多个 GC 线程同时清理 Eden 和 Survivor 区。
  • 与 CMS 高度协同:在 JDK 8 及之前,ParNew 是 CMS 的默认新生代搭档
  • 工作模式
    • 算法:复制算法(与 Serial 相同)
    • 机制:仍为 STW,但因并行执行,停顿时间显著短于 Serial
  • 线程数控制
    • 默认值 ≈ CPU 核数(≤8 时等于核数;>8 时按公式3 + (5 * CPU_Count) / 8计算)

2.3 工作原理(文字描述)

当 Eden 区满时,ParNew 触发 Minor GC:

  1. 所有应用线程暂停(STW)。
  2. 多个 GC 线程并行扫描 Eden 和 From Survivor 区。
  3. 存活对象被复制到 To Survivor 区(或直接晋升到老年代)。
  4. 清空 Eden 和 From Survivor,交换 Survivor 角色。
  5. 应用线程恢复运行。

💡 由于新生代对象“朝生夕死”,ParNew 能高效完成回收。

2.4 配置参数

# 启用 ParNew(JDK 8 及更早)-XX:+UseParNewGC# 设置 GC 线程数(建议 ≤ CPU 核数)-XX:ParallelGCThreads=4

⚠️重要提示

  • -XX:+UseParNewGCJDK 9+ 已被移除(因 CMS 被废弃)。
  • 单独使用该参数时,老年代会回退到Serial Old,但这不是推荐用法。
  • 正确用法是配合 CMS-XX:+UseConcMarkSweepGC(自动启用 ParNew)。

2.5 适用场景

  • 多核服务器环境
  • Web 应用、微服务(JDK 8 时代)
  • 暂停时间敏感,但可接受一定吞吐量损失的系统

3. 吞吐量优先回收器(Parallel Scavenge / ParallelGC)

3.1 概述

Parallel Scavenge(常称 ParallelGC)是JDK 8 Server 模式的默认垃圾回收器,其设计目标不是“停顿短”,而是最大化应用程序的吞吐量

📌 吞吐量 = 应用程序运行时间 / (应用程序运行时间 + GC 时间)

3.2 设计目标

  • 高吞吐量:让 CPU 尽可能多地执行业务逻辑。
  • 自适应调节:根据运行时数据动态调整堆结构和 GC 策略。

3.3 新生代 ParallelGC 特性

  • 回收算法:复制算法
  • 并行执行:多线程清理新生代
  • 自适应策略(AdaptiveSizePolicy)
    • 自动调整 Eden 与 Survivor 区比例
    • 动态计算对象晋升老年代的年龄阈值(MaxTenuringThreshold)
  • 权衡:可能产生较长的单次 GC 暂停,但整体吞吐量更高

3.4 老年代 ParallelOldGC 特性

  • 回收算法:标记-整理算法
  • 并行执行:多线程并行完成标记与整理
  • 配合使用:与 Parallel Scavenge 形成完整的高吞吐量回收方案

3.5 核心参数

# 启用 ParallelGC(JDK 8 默认)-XX:+UseParallelGC# 显式启用 ParallelOld(通常无需指定)-XX:+UseParallelOldGC# 目标最大暂停时间(毫秒,非硬性保证)-XX:MaxGCPauseMillis=100# 吞吐量目标:GC 时间占比 = 1/(1+n)# n=19 → GC 占比 ≤5%,吞吐量 ≥95%-XX:GCTimeRatio=19# GC 线程数-XX:ParallelGCThreads=8# 启用自适应大小调整(默认开启)-XX:+UseAdaptiveSizePolicy

3.6 工作流程示例(Minor GC)

  1. Eden 区满,触发 Minor GC。
  2. 应用线程暂停(STW)。
  3. 多线程并行复制存活对象到 Survivor 或老年代。
  4. Eden 清空,应用恢复。
  5. 若老年代空间不足,可能触发 Full GC(由 Parallel Old 执行)。

4. 四种回收器对比总结

特性串行回收器ParNewParallelGCParallelOldGC
回收区域新生代 + 老年代新生代新生代老年代
线程模式单线程多线程多线程多线程
回收算法复制 / 标记-整理复制复制标记-整理
设计目标简单稳定降低暂停时间高吞吐量高吞吐量
暂停时间较短可能较长可能较长
吞吐量中等
适用场景单核/客户端多核 + CMS后台计算后台计算
内存开销最小中等中等中等
JDK 支持所有版本JDK 8 及更早JDK 8 默认JDK 6u14+

🔍日志识别技巧

  • [DefNew]→ Serial
  • [ParNew]→ ParNew
  • [PSYoungGen]→ Parallel Scavenge
  • [ParOldGen]→ Parallel Old
  • [Tenured]→ Serial Old

5. 如何选择合适的垃圾回收器

5.1 选择指南

应用类型推荐 GC 组合理由
客户端/桌面应用-XX:+UseSerialGC内存小、单核、简单稳定
Web 应用/微服务(JDK 8)-XX:+UseParNewGC -XX:+UseConcMarkSweepGC降低 GC 暂停,提升响应速度
后台计算/批处理-XX:+UseParallelGC最大化吞吐量,适合计算密集型任务
内存 < 100MB-XX:+UseSerialGC额外开销最小

5.2 参数调优示例

吞吐量优先的批处理应用
java -Xmx4g -Xms4g\-XX:+UseParallelGC\-XX:MaxGCPauseMillis=100\-XX:GCTimeRatio=19\-XX:+PrintGCDetails\-jar batch-app.jar
响应时间敏感的 Web 应用(JDK 8)
java -Xmx2g -Xms2g\-XX:+UseConcMarkSweepGC\-XX:CMSInitiatingOccupancyFraction=75\-XX:+UseCMSInitiatingOccupancyOnly\-XX:+PrintGCDetails\-jar web-app.jar

💡 注意:-XX:+UseParNewGC在配合 CMS 时可省略,因 CMS 会自动启用它。


6. 监控与诊断

6.1 常用监控命令

# 输出详细 GC 日志-XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:/path/to/gc.log# 实时监控(每秒刷新)jstat -gc<pid>1000# 图形化工具jvisualvm

6.2 关键指标解读

指标说明
吞吐量应用运行时间占总时间的比例(越高越好)
暂停时间单次 GC 导致应用停顿的时间(越低越好)
GC 频率单位时间内 GC 次数(过高可能内存不足)
内存占用堆内存使用情况(观察是否频繁 Full GC)

7. 总结与展望

本文详细介绍了四种经典的垃圾回收器:

  • Serial:简单稳定的基石,适合资源受限环境。
  • ParNew:多核时代的新生代优化,与 CMS 默契配合。
  • ParallelGC:吞吐量优先的默认选择,适合后台计算。
  • ParallelOldGC:ParallelGC 的老年代搭档,提供完整高吞吐方案。

🔄演进趋势
从 JDK 9 开始,G1 成为默认 GC;JDK 11 引入ZGC(亚毫秒停顿);JDK 17+ 进一步推广虚拟线程(Project Loom),改变并发模型。

尽管如此,在嵌入式、小型服务或旧系统维护中,这四大经典回收器仍有其不可替代的价值。理解它们的原理与边界,是 JVM 调优的第一步

Q1:为什么ParallelGC不适合Web应用?

A:Web应用对响应时间敏感,ParallelGC的单次停顿可能达到几百毫秒,导致用户体验差。G1/ZGC的停顿时间通常控制在10-200ms内。

Q2:如何判断该选择哪种GC?

A:遵循以下决策流程:

1. 确定需求:吞吐量优先 vs 低延迟优先 2. 评估硬件:单核/小内存 → Serial;多核/大内存 → Parallel或G1 3. 考虑JDK版本:JDK8 → ParallelGC/CMS;JDK11+ → G1;JDK15+ → ZGC 4. 测试验证:用真实负载测试不同GC的表现

Q3:GC日志中的"user"、“sys”、"real"时间代表什么?

[Times: user=0.19 sys=0.00 real=0.18 secs] - user: GC线程消耗的CPU时间总和 - sys: 操作系统调用和等待时间 - real: 应用程序实际暂停时间(墙钟时间) 对于ParallelGC:real < user (多核并行) 对于SerialGC:real ≈ user + sys (单核串行)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1131190.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Net Tools v1.1.2:一站式 Windows 网络运维工具箱

Net Tools v1.1.2 是基于 Electron 开发的 Windows 桌面网络运维工具箱&#xff0c;整合 SSH/Telnet/ 串口终端、批量执行、设备管理及测速等核心功能&#xff0c;为运维人员提供高效便捷的解决方案&#xff0c;无需在多个工具间来回切换&#xff0c;适配各类企业及个人网络运维…

LongVideoAgent:多智能体推理与长视频

近期&#xff0c;多模态大语言模型及借助工具进行长视频问答的系统在小时级剧集推理方面展现出巨大潜力。然而&#xff0c;许多方法仍将内容压缩为有损摘要或依赖有限工具集&#xff0c;这削弱了时间定位能力并遗漏了细粒度线索。 我们提出一种多智能体框架&#xff1a;其中主…

突破性能极限:如何用Z-Image-Turbo预置镜像实现2K高清输出

突破性能极限&#xff1a;如何用Z-Image-Turbo预置镜像实现2K高清输出 对于专业摄影师而言&#xff0c;将AI生成图像用于商业图库是一个极具吸引力的方向&#xff0c;但大多数模型在高分辨率输出时面临质量不稳定、生成速度慢等问题。Z-Image-Turbo预置镜像通过创新的8步蒸馏技…

游戏开发者的秘密武器:快速集成Z-Image-Turbo角色概念生成

游戏开发者的秘密武器&#xff1a;快速集成Z-Image-Turbo角色概念生成 对于独立游戏制作人来说&#xff0c;角色概念设计往往是既关键又耗时的环节。Z-Image-Turbo作为阿里开源的6B参数图像生成模型&#xff0c;能以8步快速出图&#xff0c;特别适合游戏开发中的角色原型设计。…

多地布局:直线模组与直线电机服务团队如何覆盖全国

从深圳起步&#xff0c;深耕本地市场威洛博的总部位于深圳&#xff0c;这个中国科技创新的重要城市为公司的起步提供了得天独厚的地理与技术优势。作为一家高精度线性运动系统解决方案提供商&#xff0c;威洛博深知&#xff0c;创新和品质是企业长期发展的**。因此&#xff0c;…

AI辅助漫画创作:Z-Image-Turbo分镜生成专用环境搭建指南

AI辅助漫画创作&#xff1a;Z-Image-Turbo分镜生成专用环境搭建指南 对于漫画创作者来说&#xff0c;分镜设计是创作过程中最耗时的环节之一。Z-Image-Turbo作为阿里开源的6B参数图像生成模型&#xff0c;经过特殊配置后可以成为漫画分镜设计的强力助手。本文将详细介绍如何快速…

C语言float转十六进制

你想知道如何用 C 语言实现 float 类型数据转十六进制,这里要先明确两个核心场景:一是float 数值的十六进制表示(如 3.14f 转成 3.23D7),二是float 在内存中存储的十六进制字节(IEEE 754 标准),我会分别给出完整的实现代码和详细解释。 场景 1:float 数值的十六进制表…

冥想第一千七百五十六天(1756)

1.周二&#xff0c;这几天太忙了&#xff0c;都忘记写日记了&#xff0c;下班了游泳&#xff0c;很舒服。 2.感谢父母&#xff0c;感谢朋友&#xff0c;感谢家人&#xff0c;感谢不断进步的自己。

AI艺术展:用Z-Image-Turbo快速生成系列主题作品的策展指南

AI艺术展&#xff1a;用Z-Image-Turbo快速生成系列主题作品的策展指南 如果你正在筹备一场AI艺术展览&#xff0c;需要批量生成风格统一的作品&#xff0c;Z-Image-Turbo可能是你的理想选择。这款基于通义造相技术的文生图模型&#xff0c;能够快速产出高质量图像&#xff0c;特…

Z-Image-Turbo模型压测全攻略:预装监控工具的云端测试环境

Z-Image-Turbo模型压测全攻略&#xff1a;预装监控工具的云端测试环境 如果你正在寻找一个开箱即用的Z-Image-Turbo模型压力测试环境&#xff0c;那么这篇指南正是为你准备的。本文将详细介绍如何使用预装监控工具的云端测试环境&#xff0c;快速评估Z-Image-Turbo在高并发场景…

国内网络准入系统排行榜你知道吗?2025六大主流网络准入系统推荐

陌生设备蹭网、病毒偷偷入侵&#xff1f;还搞不清网络准入控制是什么&#xff1f;别慌&#xff01;2025 年这份干货超及时&#xff0c;精选六大主流网络准入控制系统&#xff0c;搞懂网络准入控制&#xff0c;轻松挡住不安全设备&#xff0c;企业网络安全瞬间有保障&#xff5e…

游戏开发捷径:用阿里通义Z-Image-Turbo快速生成角色概念图

游戏开发捷径&#xff1a;用阿里通义Z-Image-Turbo快速生成角色概念图 为什么你需要这个工具&#xff1f; 作为独立游戏开发者&#xff0c;美术资源往往是最大的瓶颈之一。传统角色概念设计需要雇佣专业画师&#xff0c;成本高、周期长。而阿里通义Z-Image-Turbo正是为解决这个…

Java企业级风控实战:对接天远多头借贷行业风险版API构建信贷评分引擎

重构信贷风控的“数据防线” 在银行、持牌消金及大型互金平台的信贷审批流程中&#xff0c;Java 承载着核心的业务逻辑。面对日益隐蔽的“多头共债”人群&#xff0c;仅靠央行征信往往难以覆盖高频的小额网贷记录。业务系统需要一个能够实时量化借款人“饥渴度”的外部探针。 天…

冥想第一千七百五十七天(1757)

1.周三&#xff0c;太忙了&#xff0c;有点头疼&#xff0c;下班跑了步。 2.感谢父母&#xff0c;感谢朋友&#xff0c;感谢家人,感谢不断进步的自己。

Z-Image-Turbo模型剖析:免搭建的云端实验环境带你深入理解

Z-Image-Turbo模型剖析&#xff1a;免搭建的云端实验环境带你深入理解 作为一名AI学习者&#xff0c;你是否曾被复杂的实验环境搭建过程困扰&#xff1f;想要深入理解Z-Image-Turbo模型的架构和原理&#xff0c;却被各种依赖安装、环境配置等问题分散了精力&#xff1f;本文将带…

图吧工具箱 V 2026.01:专业硬件检测工具

图吧工具箱 V2026.01 是一款专业级Windows硬件检测工具合集&#xff0c;集成了全面硬件信息查询、性能测试和系统维护功能。这款免费开源软件经过8年持续更新&#xff0c;以绿色纯净、无广告无捆绑的特点&#xff0c;成为DIY爱好者和电脑维护人员的必备工具。一、软件核心优势1…

跨平台开发方案:在Unity中集成Z-Image-Turbo图像生成功能

跨平台开发方案&#xff1a;在Unity中集成Z-Image-Turbo图像生成功能 作为一名游戏开发者&#xff0c;你是否遇到过这样的困境&#xff1a;在Unity编辑器里反复调整素材却始终达不到理想效果&#xff1f;或者需要快速生成大量风格化图像但苦于没有高效工具&#xff1f;本文将介…

阿里通义Z-Image-Turbo WebUI扩展开发:快速添加自定义功能

阿里通义Z-Image-Turbo WebUI扩展开发&#xff1a;快速添加自定义功能 作为一名全栈工程师&#xff0c;我在使用AI图像生成平台时经常遇到一个痛点&#xff1a;想要扩展功能但又担心破坏核心代码的稳定性。阿里通义Z-Image-Turbo WebUI提供的扩展机制完美解决了这个问题&#x…

10分钟玩转阿里通义Z-Image-Turbo:零基础搭建你的AI绘画工坊

10分钟玩转阿里通义Z-Image-Turbo&#xff1a;零基础搭建你的AI绘画工坊 作为一名数字艺术爱好者&#xff0c;你是否曾被AI生成图像的无限创意所吸引&#xff0c;却又被复杂的模型部署和GPU配置劝退&#xff1f;阿里通义Z-Image-Turbo作为一款高性能文生图模型&#xff0c;能够…

冥想第一千七百五十八天(1758)

1.周四&#xff0c;上午开会&#xff0c;忙的不得了&#xff0c;下午稍微喘口气了&#xff0c;然后又来活了。 2.感谢父母&#xff0c;感谢朋友&#xff0c;感谢家人&#xff0c;感谢不断进步的自己。