当前位置: 首页 > news >正文

JVM(3)——垃圾回收器

本文将深入剖析JVM垃圾回收器的核心原理、实现细节和调优实践,涵盖7大主流回收器+3大前沿技术+20个调优参数,通过GC日志真实案例+内存布局示意图,带您彻底掌握JVM内存回收的底层机制。

一、垃圾回收器架构全景

1.1 回收器代际关系

1.2 关键特性对比

回收器JDK版本工作模式暂停时间适用堆大小碎片处理
Serial全版本STW<100MB整理
ParNew≤8STW<4GB
Parallel全版本STW4-8GB整理
CMS≤14并发4-8GB不处理
G1≥7并发可控>4GB整理
ZGC≥15并发亚毫秒>8GB整理
ShenandoahOpenJDK并发亚毫秒>8GB整理

二、经典回收器深度解析

2.1 Serial/Serial Old - 单线程时代的基石

组合方式

  • 新生代:Serial(复制算法)

  • 老年代:Serial Old(标记-整理算法)

工作流程

适用场景

  • 客户端应用(-client模式)

  • 嵌入式设备

  • 内存<100MB的小型应用

参数启用

-XX:+UseSerialGC

2.2 ParNew/CMS - 并发回收的里程碑

ParNew工作特点:
  • Serial的多线程版本

  • 与CMS配合使用

  • 默认线程数 = CPU核心数

# 启用ParNew
-XX:+UseParNewGC# 设置线程数
-XX:ParallelGCThreads=4
CMS四阶段详解:

关键调优参数

-XX:CMSInitiatingOccupancyFraction=75 # 老年代75%时触发
-XX:+CMSScavengeBeforeRemark # 重新标记前YGC
-XX:+UseCMSCompactAtFullCollection # FullGC后压缩

2.3 Parallel Scavenge/Old - 吞吐量之王

设计哲学

吞吐量 = 应用运行时间 / (应用运行时间 + GC时间) * 100%

自适应策略

参数配置

# 启用Parallel
-XX:+UseParallelGC
-XX:+UseParallelOldGC# 吞吐量目标
-XX:GCTimeRatio=99  # GC时间占比1%
-XX:MaxGCPauseMillis=200  # 最大暂停时间

三、现代回收器革命性突破

3.1 G1(Garbage-First) - JDK9+默认回收器

内存布局创新:

核心工作流程:

调优矩阵

目标关键参数推荐值
低延迟-XX:MaxGCPauseMillis50-200ms
高吞吐-XX:GCPauseIntervalMillis300-500ms
大堆-XX:G1HeapRegionSize4-32MB
快速启动-XX:G1ConcRefinementThreadsCPU核心数

3.2 ZGC - 亚毫秒级暂停的奇迹

三大核心技术:
  1. 染色指针(Colored Pointers)

    // 64位指针结构
    | 18位保留 | 1位Finalizable | 1位Remap | 1位Marked1 | 1位Marked0 | 42位地址 |
  2. 内存多重映射

    # Linux查看内存映射
    cat /proc/<pid>/maps | grep heap

  3. 并发对象转移

    // 对象移动时引用自愈
    void accessField() {// 访问字段时自动修正指针
    }

参数配置

-XX:+UseZGC 
-XX:ZAllocationSpikeTolerance=5.0
-XX:ZProactive=true  # 主动触发GC

3.3 Shenandoah - 低延迟的开放选择

Brooks指针实现:
struct Object {uint64_t forwarding_pointer;  // 指向新地址uint32_t hash;uint16_t lock_bits;// ... 其他字段
};
工作流程对比:
阶段G1ShenandoahZGC
初始标记STWSTWSTW
并发标记并发并发并发
最终标记STWSTWSTW
清理STW并发并发
对象转移STW并发并发

适用场景

  • 需要亚毫秒暂停的实时系统

  • OpenJDK环境

  • 32GB以上大内存

四、生产环境调优实战

4.1 CMS调优案例

问题现象

[GC (Allocation Failure) [ParNew: 367616K->40960K(367616K), 0.0468480 secs]
524289K->524289K(786432K), [CMS: 0K->0K(786432K), 0.0 secs]
// 频繁Concurrent Mode Failure

优化方案

# 原配置
-XX:CMSInitiatingOccupancyFraction=70# 优化配置
-XX:CMSInitiatingOccupancyFraction=60
-XX:+UseCMSInitiatingOccupancyOnly
-XX:+CMSScavengeBeforeRemark
-XX:ParallelGCThreads=8

4.2 G1调优案例

问题现象

[GC pause (G1 Evacuation Pause) (young) [Object Copy: 1500 ms]  # 对象复制耗时过长

优化方案

# 原配置
-XX:MaxGCPauseMillis=100# 优化配置
-XX:MaxGCPauseMillis=200
-XX:G1NewSizePercent=10
-XX:G1MaxNewSizePercent=30
-XX:G1HeapRegionSize=16m

五、回收器选择决策树

http://www.lryc.cn/news/571087.html

相关文章:

  • 【Java】脱离 JVM 约束 GraalVM + Liberica NIK + Spring + Docker 将 Java 编译为平台二进制可执行文件
  • 实现回显服务器(Echo)基于Tcp
  • 计算机网络期末速成 网络层 判断及单选题
  • FPGA基础 -- Verilog语言要素之格式
  • IPv6中的ARP“NDP协议详解“
  • Cesium快速入门到精通系列教程十:实现任意多个蜂巢似六边形组合
  • 内存泄漏到底是个什么东西?如何避免内存泄漏
  • 【企业容灾灾备系统规划】
  • 算法 学习 排序 2025年6月16日10:25:37
  • 用元框架思维,系统化构建你的专属AI助手Prompt
  • wpf 队列(Queue)在视觉树迭代查找中的作用分析
  • 记一次 .NET 某SaaS版CRM系统 崩溃分析
  • C#/.NET/.NET Core技术前沿周刊 | 第 42 期(2025年6.9-6.15)
  • 基于 C# 和 .NET 的 Spread.NET 数据处理实战
  • 深度学习入门指南:从基础概念到代码实践
  • vscode snippet 工程模板文件分享
  • CentOS 7 环境下 Visual Studio Code 安装与部署
  • 高防 IP 是如何帮助数藏行业防刷的
  • Objective-C与Swift混合编程
  • UDP访问DNS
  • Ubuntu 22.04离线安装Docker和NVIDIA Container Toolkit(使用gpu)
  • “智眸·家联“项目开发(一)
  • 【Java】抽象类与接口全解析
  • 【寻找Linux的奥秘】第十章:基础文件IO(上)
  • RGB解码:神经网络如何通过花瓣与叶片的数字基因解锁分类奥秘
  • 【云计算领域数学基础】组合数学优化
  • 基于nacos和gateway搭建微服务管理平台详细教程
  • elementui响应式数据类型变更情况
  • CVPR 2025最佳论文详解|VGGT:纯前馈Transformer架构,3D几何感知「大一统」模型来了!
  • FPGA基础 -- Verilog语言要素之值集合