news 2026/4/26 0:29:32

JVM 调优实战指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
JVM 调优实战指南

系列导读:本篇将深入讲解 JVM 调优的核心原理与实战技巧。


文章目录

    • 目录
    • 一、JVM 内存模型
      • 1.1 内存结构
      • 1.2 内存参数
    • 二、垃圾回收器
      • 2.1 GC 对比
      • 2.2 G1 配置
      • 2.3 ZGC 配置
    • 三、调优参数
      • 3.1 内存配置
      • 3.2 GC 配置
      • 3.3 日志配置
    • 四、问题诊断
      • 4.1 常用工具
      • 4.2 OOM 排查
      • 4.3 CPU 飙高排查
    • 五、实战案例
      • 5.1 案例:Full GC 频繁
      • 5.2 案例:内存泄漏
    • 总结

目录

  • 一、JVM 内存模型
  • 二、垃圾回收器
  • 三、调优参数
  • 四、问题诊断
  • 五、实战案例
  • 总结

一、JVM 内存模型

1.1 内存结构

┌─────────────────────────────────────────────────────────────┐ │ JVM 内存结构 │ ├─────────────────────────────────────────────────────────────┤ │ │ │ ┌─────────────────────────────────────────────────────┐ │ │ │ 堆 (Heap) │ │ │ │ ┌─────────────┐ ┌─────────────┐ │ │ │ │ │ 新生代 │ │ 老年代 │ │ │ │ │ │ Eden+Survivor│ │ (Old) │ │ │ │ │ └─────────────┘ └─────────────┘ │ │ │ └─────────────────────────────────────────────────────┘ │ │ │ │ ┌─────────────────────────────────────────────────────┐ │ │ │ 方法区 (Metaspace) │ │ │ └─────────────────────────────────────────────────────┘ │ │ │ │ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ │ │ │ 程序计数器│ │虚拟机栈 │ │本地方法栈│ │ 直接内存 │ │ │ └──────────┘ └──────────┘ └──────────┘ └──────────┘ │ │ │ └─────────────────────────────────────────────────────────────┘

1.2 内存参数

参数说明
-Xms初始堆大小
-Xmx最大堆大小
-Xmn新生代大小
-XX:MetaspaceSize元空间初始大小
-XX:MaxMetaspaceSize元空间最大大小

二、垃圾回收器

2.1 GC 对比

GC说明适用场景
Serial单线程客户端
Parallel多线程吞吐优先
CMS并发标记清除低延迟
G1分区收集大堆、低延迟
ZGC并发整理超大堆、极低延迟

2.2 G1 配置

# G1 GC 配置-XX:+UseG1GC-XX:MaxGCPauseMillis=200-XX:G1HeapRegionSize=16m-XX:InitiatingHeapOccupancyPercent=45-XX:G1ReservePercent=10

2.3 ZGC 配置

# ZGC 配置 (JDK 15+)-XX:+UseZGC-XX:ZCollectionInterval=5-XX:ZAllocationSpikeTolerance=5-XX:+UnlockDiagnosticVMOptions-XX:+ZProactive

三、调优参数

3.1 内存配置

# 推荐配置-Xms4g# 初始堆 = 最大堆-Xmx4g# 避免动态扩容-Xmn2g# 新生代 = 堆的 50%-XX:MetaspaceSize=256m-XX:MaxMetaspaceSize=512m-XX:+UseCompressedOops# 压缩指针-XX:+UseCompressedClassPointers

3.2 GC 配置

# G1 GC 完整配置-XX:+UseG1GC-XX:MaxGCPauseMillis=200-XX:G1HeapRegionSize=16m-XX:InitiatingHeapOccupancyPercent=45-XX:G1ReservePercent=10-XX:G1NewSizePercent=5-XX:G1MaxNewSizePercent=60-XX:G1HeapWastePercent=5-XX:G1MixedGCCountTarget=8-XX:G1MixedGCLiveThresholdPercent=85

3.3 日志配置

# GC 日志 (JDK 11+)-Xlog:gc*:file=gc.log:time,level,tags:filecount=5,filesize=10m

四、问题诊断

4.1 常用工具

工具说明
jstatGC 统计
jmap内存映射
jstack线程栈
jinfoJVM 信息
VisualVM可视化分析
Arthas在线诊断

4.2 OOM 排查

# 导出堆转储jmap-dump:format=b,file=heap.hprof<pid># 分析堆转储# 使用 MAT 或 VisualVM 分析

4.3 CPU 飙高排查

# 查看线程 CPU 使用top-H-p<pid># 导出线程栈jstack<pid>>thread.log# 找到高 CPU 线程对应的堆栈# 线程 ID 转 16 进制printf"%x\n"<thread_id>

五、实战案例

5.1 案例:Full GC 频繁

问题现象:系统每隔几分钟 Full GC 分析步骤: 1. jstat -gcutil <pid> 1000 2. 发现老年代增长快 3. jmap -histo <pid> 查看对象分布 4. 发现大量大对象 解决方案: 1. 增大堆内存 2. 调整新生代比例 3. 优化代码减少大对象

5.2 案例:内存泄漏

问题现象:老年代持续增长,Full GC 无法回收 分析步骤: 1. jmap -dump 导出堆转储 2. MAT 分析 Dominator Tree 3. 找到占用最大的对象 4. 查看 GC Roots 解决方案: 1. 修复代码中的泄漏点 2. 使用 WeakReference 替代强引用

总结

JVM 内存模型:堆、栈、方法区
垃圾回收器:G1、ZGC
调优参数:内存、GC、日志
问题诊断:OOM、CPU 飙高
实战案例:Full GC、内存泄漏

下篇预告:系统性能瓶颈分析与优化


作者:刘~浪地球
系列:性能优化(一)
更新时间:2026-04-25

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

Agent-C:4KB纯C语言AI智能体,零依赖实现本地Shell命令执行

1. 项目概述&#xff1a;一个极简主义的AI执行者 最近在折腾AI应用本地化部署时&#xff0c;我一直在寻找一个能真正“轻装上阵”的解决方案。市面上的AI Agent框架动辄几百MB&#xff0c;依赖库一大堆&#xff0c;部署起来让人头疼。直到我遇到了Agent-C&#xff0c;一个用纯…

作者头像 李华
网站建设 2026/4/26 0:18:26

基于.NET与Avalonia的上下文感知AI助手Everywhere:无缝集成LLM与MCP工具

1. 项目概述&#xff1a;Everywhere&#xff0c;一个真正理解你屏幕的智能助手如果你和我一样&#xff0c;每天的工作流里充斥着各种窗口切换——浏览器查资料、IDE写代码、终端跑命令、邮件客户端处理沟通&#xff0c;再时不时切到ChatGPT或者Claude的网页版去问个问题&#x…

作者头像 李华
网站建设 2026/4/26 0:18:25

Postman便携版:Windows免安装API开发终极指南

Postman便携版&#xff1a;Windows免安装API开发终极指南 【免费下载链接】postman-portable &#x1f680; Postman portable for Windows 项目地址: https://gitcode.com/gh_mirrors/po/postman-portable 你是否厌倦了每次换电脑都要重新安装Postman&#xff1f;是否因…

作者头像 李华
网站建设 2026/4/26 0:15:25

2026届最火的AI辅助写作平台实测分析

Ai论文网站排名&#xff08;开题报告、文献综述、降aigc率、降重综合对比&#xff09; TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 在人工智能进行交互期间&#xff0c;指令存在冗余情形常常会致使输出出现偏差以及造成效率方…

作者头像 李华
网站建设 2026/4/26 0:11:28

CentOS 7.9 离线安装 Docker 完整指南【20260425-003篇】

文章目录 ✅ 推荐方案一:二进制静态安装(推荐用于严格离线/快速验证/最小依赖) 步骤详解(全部命令在目标离线服务器执行): 1️⃣ 下载二进制包(在**有网机器**操作) 2️⃣ 上传并解压到离线服务器(如 `/root` 目录) 3️⃣ 安装二进制文件到系统 PATH 4️⃣ 创建 syst…

作者头像 李华