news 2026/3/27 18:39:28

Java 垃圾回收器详解

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Java 垃圾回收器详解

Java 虚拟机 (JVM) 提供了多种垃圾回收器,每种都有不同的特点和适用场景。以下是对各垃圾回收器的详细解析。

1. 垃圾回收器分类概览

按工作模式分类:

  • 串行回收器:单线程工作,适合客户端应用

  • 并行回收器:多线程并行回收,注重吞吐量

  • 并发回收器:部分工作与应用线程并发执行,减少停顿时间

  • 分区回收器:将堆划分为多个区域,独立回收

按分代策略分类:

  • 新生代回收器:Serial、ParNew、Parallel Scavenge

  • 老年代回收器:Serial Old、Parallel Old、CMS

  • 整堆回收器:G1、ZGC、Shenandoah

2. 经典分代回收器

2.1 Serial / Serial Old(串行回收器)

  • 工作机制:单线程STW(Stop-The-World)回收

  • 算法:新生代使用复制算法,老年代使用标记-整理算法

  • 适用场景:客户端模式,内存<100MB,单核CPU

  • 启用参数-XX:+UseSerialGC

// Serial GC 工作示意图 新生代 Eden + Survivor (From) → Survivor (To) 老年代 标记-整理 → 压缩空间

2.2 ParNew(并行新生代回收器)

  • 工作机制:Serial的多线程并行版本

  • 特点:与CMS配合使用,多核CPU下效率高

  • 启用参数-XX:+UseParNewGC

2.3 Parallel Scavenge / Parallel Old(吞吐量优先回收器)

  • 目标:最大化吞吐量(应用程序运行时间/总时间)

  • 特点:自适应调节策略,适合后台计算

  • 参数控制

-XX:+UseParallelGC # 新生代并行 -XX:+UseParallelOldGC # 老年代并行 -XX:MaxGCPauseMillis=100 # 目标最大停顿时间 -XX:GCTimeRatio=99 # 吞吐量目标(GC时间/总时间) -XX:+UseAdaptiveSizePolicy # 自适应调节策略

3. CMS(Concurrent Mark Sweep)回收器

3.1 设计目标

  • 低延迟:减少STW时间

  • 并发执行:大部分工作与应用线程并发

3.2 工作流程(四阶段)

  1. 初始标记(Initial Mark)- STW

    • 标记GC Roots直接关联对象

    • 短暂停顿

  2. 并发标记(Concurrent Mark)

    • 遍历对象图,与应用线程并发

    • 时间长但无停顿

  3. 重新标记(Remark)- STW

    • 修正并发标记期间变动的部分

    • 比初始标记稍长

  4. 并发清除(Concurrent Sweep)

    • 清理垃圾对象

3.3 优缺点

优点

  • 低停顿时间

  • 并发执行

缺点

  • 内存碎片问题

  • 对CPU资源敏感

  • 无法处理浮动垃圾

  • JDK9标记废弃,JDK14移除

3.4 参数配置

-XX:+UseConcMarkSweepGC # 启用CMS -XX:CMSInitiatingOccupancyFraction=70 # 触发阈值(老年代使用率) -XX:+UseCMSInitiatingOccupancyOnly # 使用固定阈值 -XX:+CMSFullGCsBeforeCompaction=5 # 多少次FullGC后压缩

4. G1(Garbage First)回收器

4.1 核心设计

  • Region分区:将堆划分为2048个Region(1MB-32MB)

  • 分代逻辑:逻辑分代,物理不分代

  • 回收策略:优先回收价值最大(垃圾最多)的Region

4.2 工作模式

Young GC(年轻代回收)
  • Eden区满时触发

  • 存活对象复制到Survivor区或晋升老年代

Mixed GC(混合回收)
  • 老年代达到阈值(默认45%)触发

  • 回收所有年轻代+部分老年代Region

  • 阶段:初始标记 → 并发标记 → 最终标记 → 筛选回收

4.3 参数配置

-XX:+UseG1GC # 启用G1 -XX:G1HeapRegionSize=16m # Region大小 -XX:MaxGCPauseMillis=200 # 目标停顿时间 -XX:InitiatingHeapOccupancyPercent=45 # 触发并发标记阈值 -XX:ConcGCThreads=4 # 并发标记线程数

5. ZGC(Z Garbage Collector)

5.1 设计目标

  • 亚毫秒级停顿:<10ms,与堆大小无关

  • 超大堆支持:支持TB级别堆内存

  • 高吞吐量:损失<15%

5.2 核心技术

  1. 染色指针(Colored Pointers)

    • 在指针中存储元数据(标记位、重映射位等)

    • 64位指针布局:

      0-41位:对象地址(4TB寻址) 42-45位:元数据位(标记、重定位等) 46-63位:未使用
  2. 读屏障(Load Barrier)

    • 在读取对象时执行特定操作

    • 检查指针状态,必要时触发修复

5.3 工作阶段

  • 并发标记(Concurrent Mark)

  • 并发预备重分配(Concurrent Prepare for Relocate)

  • 并发重分配(Concurrent Relocate)

  • 并发重映射(Concurrent Remap)

5.4 参数配置

-XX:+UseZGC # 启用ZGC -XX:ZAllocationSpikeTolerance=2.0 # 分配速率容忍度 -XX:ZCollectionInterval=0 # 触发GC的时间间隔 -XX:ZUncommitDelay=300 # 内存延迟归还时间(秒)

6. Shenandoah GC

6.1 特点

  • 低停顿:与ZGC类似,停顿时间与堆大小无关

  • 并发压缩:真正的并发整理

  • Brooks指针:转发指针技术

6.2 工作流程

  1. 初始标记(STW)

  2. 并发标记

  3. 最终标记(STW)

  4. 并发清理

  5. 并发压缩

  6. 并发更新引用

6.3 参数配置

-XX:+UseShenandoahGC -XX:ShenandoahGCHeuristics=adaptive # 启发式策略 -XX:ShenandoahPacingInterval=10 # 分配速率控制间隔(毫秒)

7. 回收器对比与选型

特性SerialParallelCMSG1ZGCShenandoah
并发性STW并行部分并发部分并发完全并发完全并发
整理算法整理整理清除局部整理并发整理并发整理
停顿时间中等可控极短极短
吞吐量中等
适用场景客户端后端服务Web应用大堆应用超大堆低延迟大堆低延迟

8. 选型建议

8.1 根据应用类型选择

  1. 客户端/小型应用:Serial GC

  2. 吞吐量优先:Parallel GC

  3. 低延迟Web应用

    • JDK8及之前:CMS

    • JDK9+:G1

  4. 大堆内存低延迟

    • JDK11+:ZGC(Oracle JDK)

    • JDK12+:Shenandoah(OpenJDK)

8.2 根据堆大小选择

  • <4GB:Parallel GC 或 CMS

  • 4-16GB:G1

  • >16GB:ZGC 或 Shenandoah

8.3 根据延迟要求选择

  • >1秒:Parallel GC

  • 100-500ms:G1

  • <10ms:ZGC 或 Shenandoah

9. 监控与调优

9.1 常用监控命令

# 查看默认GC java -XX:+PrintCommandLineFlags -version # 查看GC详细信息 java -XX:+PrintGCDetails -XX:+PrintGCDateStamps # G1详细日志 java -XX:+UseG1GC -XX:+PrintGCDetails -XX:+PrintAdaptiveSizePolicy

9.2 关键性能指标

  • 吞吐量:应用运行时间 / 总时间

  • 停顿时间:单次GC暂停时间

  • 延迟:应用响应时间

  • 内存占用:堆内存使用率

9.3 调优步骤

  1. 分析需求:确定吞吐量/延迟优先级

  2. 选择回收器:根据堆大小和应用特点

  3. 基础配置:设置堆大小、区域大小等

  4. 参数优化:根据监控调整阈值和策略

  5. 压力测试:验证配置效果

  6. 生产监控:持续监控并调整

10. 最新发展

JDK 17+ 新特性

  1. ZGC分代(实验性):引入分代概念提升吞吐

  2. Shenandoah优化:更低的CPU开销

  3. 统一日志-Xlog:gc*统一日志格式

JDK 21 更新

  1. ZGC成为生产就绪

  2. G1持续优化:更好的预测和自适应

  3. 并行Full GC优化:减少大堆的停顿时间

总结

选择合适的垃圾回收器需要综合考虑应用特性、硬件配置和性能要求。对于现代应用,G1已经成为默认推荐,而ZGC和Shenandoah为超大堆和极低延迟场景提供了优秀解决方案。实际选型时应通过性能测试验证,并根据生产监控数据持续优化。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/20 12:07:03

Java计算机毕设之基于SpringBoot社区医疗预约挂号平台的设计与实现基于springboot的医院挂号就诊系统设计与实现(完整前后端代码+说明文档+LW,调试定制等)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华
网站建设 2026/3/24 12:21:21

如何跟上当今AI高速发展的步伐

如何跟上当今AI高速发展的步伐&#xff0c;这正是我们时代最关键的问题之一。跟上AI时代的步伐&#xff0c;并非要每个人都成为技术专家&#xff0c;而是要建立一种“AI优先”的思维模式和行动策略。以下是一套从思想到行动的系统性建议&#xff0c;希望能为你提供清晰的路径&a…

作者头像 李华
网站建设 2026/3/13 21:09:11

Android 命令行打包 APK 完全指南|极速构建不求人

告别 Android Studio 漫长等待&#xff0c;一行命令 30 秒完成 APK 打包&#xff01;本文详解 Gradle 命令行构建的所有技巧。 前言 每次用 Android Studio 打包 APK&#xff0c;你是不是都要经历&#xff1a; 点击 Build → Generate Signed Bundle / APK选择 APK&#xff0…

作者头像 李华
网站建设 2026/3/20 16:24:50

[STM32C0] 【STM32C092RC 测评】ADC

了解一下ADC先对ADC进行一定的认识分辨率&#xff0c;读出的数据的长度&#xff0c;如8位就是最大值为255的意思&#xff0c;即范围[0,255],12位就是最大值为4096&#xff0c;即范围[0,4096] 通道&#xff0c;ADC输入引脚&#xff0c;通常一个ADC控制器控制多个通道&#xff0…

作者头像 李华
网站建设 2026/3/28 5:44:22

实验四 ysy

/* project1_add.增加数据 */ #include <stdio.h> #include <stdlib.h>typedef struct {int id; // 产地IDchar name[50]; // 产地名称int yield; // 产量&#xff08;吨&#xff09; } OrangeFarm;int main() {OrangeFarm new_farm; // 本次只需定义一个结…

作者头像 李华
网站建设 2026/3/24 2:50:33

拥抱大数据领域数据服务,迎接数字时代挑战

拥抱大数据领域数据服务&#xff0c;迎接数字时代挑战 引言&#xff1a;数字时代的“数据焦虑” 凌晨两点&#xff0c;某零售企业的IT主管王磊盯着电脑屏幕上的报警信息发愁——营销部门刚发来紧急需求&#xff1a;“明天要推出‘618预热活动’&#xff0c;需要近30天所有门店的…

作者头像 李华