JVM 垃圾回收器的选择与应用原则

梦辰同学_8280

梦辰同学_8280

2026-07-07

436人浏览

原创

选jvm垃圾回收器需按业务类型、硬件资源和gc表现三维度取舍:吞吐优先用parallel,延迟敏感选g1/zgc/shenandoah,小内存用serial;堆大小与cpu核数决定回收器适用性;须结合gc日志调优,避免误用cms或强行套用zgc。

jvm 垃圾回收器的选择与应用原则

选 JVM 垃圾回收器,本质是做取舍:要么保吞吐量,要么压停顿时间,没有“全能型”。关键不在参数多不多,而在是否匹配你的应用真实负载特征——比如一个支付接口每秒扛 5000 请求,哪怕堆只设 2G,Serial 也会让用户等出幻觉;而一个夜间跑报表的批处理任务,硬上 ZGC 反而浪费 CPU 资源。

看业务类型:吞吐量优先 or 延迟敏感

这是最直接的决策起点。

  • 后台任务(ETL、日志归档、离线计算):选 Parallel GC。它用多线程抢时间,目标是让业务逻辑运行得越久越好。比如设置 -XX:GCTimeRatio=99,意味着 GC 总时间不能超过总运行时间的 1%。
  • 在线服务(API 接口、Web 应用、交易系统):停顿必须短。CMS 曾是主流,但已废弃;现在推荐 G1(JDK 9+ 默认),或更高阶的 ZGC/Shenandoah(JDK 11+ 支持)。它们把单次 STW 控在 10ms 内,对用户无感。
  • 嵌入式或桌面小工具:内存 ≤ 1GB、单核 CPU,Serial GC 反而是最轻量、最稳的选择,没线程调度开销,STW 时间也短。

看硬件资源:CPU 核心数与堆大小

回收器不是孤立工作的,它得和机器配置咬合。

Chiao AI
Chiao AI

一款AI翻译工具,主要用于AI文档翻译工具,格式还原,实时对话修改,适合需要提升相关任务效率的用户。

下载
  • 堆小于 4GB,且 CPU 少于 4 核:Parallel GC 或 Serial GC 都可,别强行上 G1 —— 它的并发线程和区域管理反而拖慢小堆。
  • 堆 ≥ 8GB,多核(≥8 核):G1 开始体现价值。它按 Region 划分堆,能预测性地控制停顿,还能通过 -XX:MaxGCPauseMillis=20 设定目标停顿上限。
  • 堆 ≥ 16GB,延迟要求严苛(如金融行情、实时风控):ZGC 是更优解。它采用着色指针 + 并发标记/移动,停顿基本稳定在 10ms 内,且不受堆大小影响。

看 GC 行为表现:别只盯参数,要观察实际指标

配置再漂亮,不看日志等于盲调。

  • 加 -Xlog:gc*:file=gc.log:time,tags(JDK 10+)或 -XX:+PrintGCDetails -XX:+PrintGCTimeStamps(旧版),抓真实 GC 频率、停顿时长、晋升速率。
  • 重点关注:Full GC 是否频繁?(说明老年代压力大,可能对象过早晋升或内存泄漏);Minor GC 间隔是否急剧缩短?(Eden 区太小或对象存活率高);GC 后老年代使用率是否持续上涨?(CMS 失败或 G1 混合回收跟不上)。
  • 别迷信“默认值”:JDK 8 默认 Parallel,JDK 11+ 默认 G1,但默认 ≠ 最适配。电商大促前换掉默认回收器,是常见预案。

避坑提醒:几个高频误用场景

这些错误,线上故障里反复出现。

  • 用 Parallel GC 跑 Web API:吞吐量上去了,但一次 Full GC 停顿 2 秒,用户请求全超时,接口监控直接告警爆炸。
  • 给小内存服务硬配 ZGC:ZGC 需要额外元数据空间和着色指针支持,在 2GB 堆下启动反而慢,还吃更多 CPU。
  • 忽略 CMS 已被移除:JDK 14 起彻底删除 CMS,JDK 17+ 不再支持。还在生产环境写 -XX:+UseConcMarkSweepGC,启动直接失败。
  • 只调回收器,不调堆结构:比如用 G1 却把 -XX:NewRatio 设成 2,强制年轻代过大,反而加剧 Mixed GC 压力。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

垃圾回收器

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
Playwright 测试失败怎么办
Playwright 测试失败怎么办

Playwright测试失败专题汇集超时、定位器匹配、浏览器提前关闭、依赖与插件配置、文件上传、SSL及Docker启动等故障文章,并介绍通过截图、报告和Trace定位错误。

2026.10.21

0

15

Playwright 页面操作指南
Playwright 页面操作指南

Playwright页面操作专题汇集元素定位、点击与输入、等待响应、多页面切换、Iframe、事件监听及文件处理的已审核文章,便于按操作场景查阅示例与常见问题。

2026.10.21

0

16

Playwright 入门教程
Playwright 入门教程

Playwright入门专题汇集测试框架安装、VS Code配置、录制脚本、编写首个用例、运行调试及查看报告的已审核文章,帮助初学者搭建端到端测试流程。

2026.10.21

0

16

OpenJDK JVM参数怎么调优
OpenJDK JVM参数怎么调优

Java应用运行缓慢,如何调整JVM参数?本专题介绍OpenJDK JVM性能调优的基本流程,涵盖性能指标确认、运行数据采集、内存配置和垃圾回收分析,帮助你先定位瓶颈,再通过对照测试验证效果,避免直接套用参数而影响应用稳定性。

2026.10.16

100

10

OpenJDK怎么配置Java开发环境
OpenJDK怎么配置Java开发环境

怎样用OpenJDK搭建开发环境?本专题介绍版本选择、下载安装、环境变量配置和编译运行验证,帮助你理清JDK的作用及基本配置流程,并通过简单程序检查环境是否可用,为后续项目开发做好准备。

2026.10.16

80

10

OpenJDK怎么部署Java应用
OpenJDK怎么部署Java应用

Java项目开发完成后,怎样部署到目标环境并正常运行?本专题介绍OpenJDK应用部署流程,涵盖运行环境准备、版本兼容检查、应用打包、启动参数配置和日志查看,帮助你理清部署前后的操作顺序,减少环境差异造成的运行问题。

2026.10.16

40

10

Revel框架模板渲染与表单验证
Revel框架模板渲染与表单验证

本专题围绕Revel框架视图层开发,介绍模板语法、变量输出、布局复用、表单提交、参数绑定与验证规则,帮助开发者完成安全规范的页面交互。

2026.10.16

40

15

Revel框架MVC路由与控制器
Revel框架MVC路由与控制器

本专题聚焦Revel框架MVC核心机制,讲解路由定义、控制器Action、参数绑定、请求响应和反向路由,并结合常见场景梳理接口请求处理流程。

2026.10.16

20

15

Revel框架入门与安装配置
Revel框架入门与安装配置

本专题从Revel框架环境搭建讲起,系统介绍命令行工具安装、项目创建、目录结构、配置文件及热代码重载,帮助开发者快速完成首个Go Web应用。

2026.10.16

40

15

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
phpStudy极速入门视频教程
phpStudy极速入门视频教程

共6课时 | 54.7万人学习

独孤九贱(4)_PHP视频教程
独孤九贱(4)_PHP视频教程

共89课时 | 133.9万人学习