【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),让虚拟机自动完成调优,省心高效。
相关推荐
p***76981 小时前
docker compose安装mindoc 后添加https访问反向代理配置教程
jvm·docker·https
techdashen2 小时前
Agent 的第三次浪潮:Cloudflare Project Think 是什么,要解决什么问题
jvm·数据库·oracle
woxihuan12345610 小时前
SQL删除数据时存在依赖关系_设置外键级联删除ON DELETE
jvm·数据库·python
Jetev11 小时前
如何确定SQL字段是否为空_使用IS NULL与IS NOT NULL
jvm·数据库·python
m0_7020365311 小时前
mysql如何处理不走索引的OR查询_使用UNION ALL优化重写
jvm·数据库·python
2401_8463395612 小时前
MySQL在云环境如何选择存储类型_SSD与高性能云盘配置建议
jvm·数据库·python
zhaoyong22213 小时前
SQL如何统计每个用户的首次行为时间_MIN聚合与分组
jvm·数据库·python
2501_9010064713 小时前
C#怎么实现配置热更新 C#如何在运行时动态刷新配置文件不需要重启程序【技巧】
jvm·数据库·python
m0_4708576413 小时前
HTML怎么创建响应式图片备选方案_HTML srcset与sizes结构【详解】
jvm·数据库·python