news 2026/5/14 3:52:20

【JVM】面试题-Parallel 回收器

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【JVM】面试题-Parallel 回收器

Parallel 回收器:吞吐量优先

在JVM的垃圾收集器家族中,Parallel系列回收器,一直是服务器端场景的“常客”,尤其是在追求高吞吐量的后台任务中,它的表现尤为突出。

======= 🌟 青柠来相伴,代码更简单。🌟 =======
📚 本文所有内容,我都整理在了 青柠合集 里。👇
🎯 搜索关注【青柠代码录】,即可查看所有合集文章 ~
======= 🌟 =================== 🌟 =======

一、Parallel回收器

提到HotSpot虚拟机的年轻代并行回收器,很多人会先想到ParNew。

但实际上,还有一个功能相近却定位不同的收集器——Parallel Scavenge(简称Parallel回收器)。

它和ParNew一样,都采用了复制算法并行回收机制,并且都会触发“Stop the World”(STW),那它的出现是不是多此一举呢?

答案当然是否定的,两者的核心差异的在于设计目标调节策略

  • ParNew的核心目标是“配合CMS收集器”,提升并发场景下的回收效率,侧重减少交互场景的停顿;
  • Parallel Scavenge的核心目标是达到可控制的吞吐量,它也因此被称为“吞吐量优先”的垃圾收集器;
  • 此外,Parallel Scavenge支持自适应调节策略,这也是它和ParNew最关键的区别之一。

二、什么是吞吐量

吞吐量(Throughput)指的是“程序运行时间”与“总时间(程序运行时间+垃圾回收时间)”的比值,吞吐量越高,意味着CPU资源被有效利用的程度越高,能更快完成程序的运算任务。

正因为如此,Parallel回收器特别适合后台运算、无需过多交互的场景,也是服务器环境中的常用选择。

比如:

  • 批量处理任务(如数据批量导入、报表生成);
  • 订单处理、工资支付等后台业务;
  • 科学计算、大数据分析等CPU密集型任务。

三、Parallel 的“黄金组合”:Parallel + Parallel Old

Parallel Scavenge最初只负责年轻代的垃圾回收,在JDK1.6时,HotSpot推出了它的老年代配套收集器——Parallel Old,用来替代老年代的Serial Old收集器,形成了完整的“年轻代+老年代”并行回收组合。

Parallel Old收集器的特性的:

  • 采用标记-压缩算法(适配老年代对象存活率高的特点);
  • 同样支持并行回收STW机制
  • 与Parallel Scavenge配合,在Server模式下能实现极佳的内存回收性能。
img

重点提醒:在Java 8中,Parallel + Parallel Old是默认的垃圾收集器组合,这也能看出它在服务器场景中的主流地位。

四、关键参数配置

Parallel系列的参数配置并不复杂,核心围绕“吞吐量、停顿时间、线程数”三个维度,下面整理了最常用的参数,附详细说明和注意事项:

1. 开启Parallel收集器

  • -XX:+UseParallelGC:手动指定年轻代使用Parallel并行收集器;
  • -XX:+UseParallelOldGC:手动指定老年代使用Parallel Old并行收集器。

注意:两个参数互相激活,只要开启其中一个,另一个会自动开启;Java 8默认已开启这两个参数,无需手动配置。

2. 控制并行线程数

-XX:ParallelGCThreads:设置年轻代并行收集器的线程数,直接影响回收效率。

  • 默认规则:CPU数量<8时,线程数=CPU数量;CPU数量≥8时,线程数=3+[5*CPU_Count]/8(平衡线程开销和回收效率);
  • 建议:一般与CPU核心数相等,避免线程过多导致上下文切换,反而降低性能。

3. 控制最大停顿时间

-XX:MaxGCPauseMillis:设置垃圾收集的最大STW停顿时间,单位为毫秒。

  • 收集器会通过调整Java堆大小、对象晋升年龄等参数,尽可能将停顿时间控制在设定值以内;
  • 注意:停顿时间越短,吞吐量可能越低(为了快速回收,会频繁触发GC),服务器端需谨慎使用,优先保证吞吐量。

4. 控制吞吐量比例

-XX:GCTimeRatio:设置垃圾回收时间占总时间的比例,公式为“垃圾回收时间 = 总时间 / (N+1)”,用于衡量吞吐量。

  • 取值范围:0~100,默认值99,意味着垃圾回收时间不超过总时间的1%(即吞吐量≥99%);
  • 与MaxGCPauseMillis的矛盾:停顿时间越长,垃圾回收耗时越多,越容易超出设定的比例,两者需根据场景权衡。

5. 开启自适应调节(推荐)

-XX:+UseAdaptiveSizePolicy:开启Parallel Scavenge的自适应调节策略。

  • 开启后,虚拟机将自动调整年轻代大小、Eden/Survivor比例、对象晋升年龄等参数,平衡堆大小、吞吐量和停顿时间;
  • 适用场景:手动调优困难时,只需指定最大堆(-Xmx)、目标吞吐量(GCTimeRatio)和停顿时间(MaxGCPauseMillis),让虚拟机自动完成调优,省心高效。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/14 3:52:20

从零构建现代音乐Web应用:React+Node.js全栈架构与核心实现

1. 项目概述与核心价值 最近在GitHub上看到一个挺有意思的项目&#xff0c;叫 chemistwang/music-app 。乍一看&#xff0c;这个名字很直白&#xff0c;就是一个“音乐应用”。但作为一个在软件开发和产品设计领域摸爬滚打了十多年的老手&#xff0c;我深知一个看似简单的项目…

作者头像 李华
网站建设 2026/5/14 3:50:30

PlanForge:轻量级项目规划工具的设计、部署与核心工作流实践

1. 项目概述&#xff1a;PlanForge&#xff0c;一个为开发者打造的轻量级项目规划工具如果你和我一样&#xff0c;经常在GitHub上寻找能提升个人或小团队开发效率的工具&#xff0c;那么看到chucoding/planforge这个仓库时&#xff0c;可能会眼前一亮。PlanForge&#xff0c;顾…

作者头像 李华
网站建设 2026/5/14 3:43:06

AI设计副驾styleseed:让AI代码生成器产出专业级UI的69条设计规则

1. 项目概述&#xff1a;当AI代码生成器遇上设计系统如果你和我一样&#xff0c;经常用 Claude Code 或者 Cursor 来快速搭建项目原型&#xff0c;那你一定也经历过那种“功能都对&#xff0c;但就是丑”的尴尬时刻。AI 能生成出逻辑正确的 React 组件&#xff0c;能用 Tailwin…

作者头像 李华
网站建设 2026/5/14 3:41:07

从零构建个人音乐流媒体应用:技术栈、核心模块与部署实践

1. 项目概述与核心价值最近在GitHub上看到一个挺有意思的项目&#xff0c;叫chemistwang/music-app。乍一看&#xff0c;这名字很直白&#xff0c;一个“音乐应用”。但作为一个在前后端和音视频领域摸爬滚打多年的开发者&#xff0c;我深知一个看似简单的音乐播放器背后&#…

作者头像 李华