欢迎光临
我们一直在努力

第 10 章:JVM 调优实战(Java 人的主场)

第 10 章:JVM 调优实战(Java 人的主场)

所属:第三部分 · 实战方法(进阶)
学习目标:会看 GC、会定位内存问题、会调基础 JVM 参数——这是你相对纯测试人的最大优势。
预计学习时间:4~5 天。


10.0 为什么这章是你的护城河

纯测试出身的人最怕 JVM。你有 Java 底子,这章学起来飞快,面试直接甩开对手。


10.1 先搞懂内存结构(够用版)

JVM 内存
├── 堆 (Heap) ← 对象都在这,GC 主战场
│ ├── 年轻代 (Young) ← 新对象,Minor GC 频繁但快
│ │ ├── Eden
│ │ └── Survivor (S0/S1)
│ └── 老年代 (Old) ← 活得久的对象,Full GC 慢
├── 元空间 (Metaspace) ← 类信息(JDK8 后不在堆里)
└── 线程栈 (Stack) ← 每个线程的方法调用

一句话记忆:新对象在年轻代出生,活得久的晋升老年代,老年代满了触发 Full GC(慢、要命)。


10.2 GC 基础:Minor GC vs Full GC

类型回收区域速度影响
Minor GC 年轻代 正常,频繁也没事
Full GC 整个堆 + 元空间 会 STW(暂停所有线程),频繁 = 灾难

性能测试核心关注点:Full GC 频率和耗时。频繁 Full GC 会让响应时间周期性抖动。


10.3 命令行工具速查(压测现场就用这些)

jps —— 找进程

jps -l # 列出所有 Java 进程和主类

jstat —— 看 GC(最常用)

jstat -gc <pid> 1000 # 每 1 秒打印一次 GC 情况
jstat -gcutil <pid> 1000 # 看各区使用百分比

关键列:

  • YGC / YGCT:Minor GC 次数 / 总耗时
  • FGC / FGCT:Full GC 次数 / 总耗时(重点盯这个)
  • O:老年代使用率(一直接近 100% 且回收不下去 = 内存泄漏嫌疑)

jstack —— 看线程(定位 CPU 高、死锁)

jstack <pid> > thread.txt

配合 top -Hp <pid> 找到高 CPU 线程 ID,转 16 进制在 jstack 里搜。

jmap —— 看内存(定位内存泄漏)

jmap -histo <pid> | head -20 # 看对象数量排行
jmap -dump:format=b,file=heap.hprof <pid> # 导出堆快照,用 MAT 分析


10.4 可视化工具

工具特点
JVisualVM JDK 自带,看堆/线程/GC,入门首选
Arthas(阿里开源) 线上诊断神器,dashboard/thread/trace 定位到方法级
MAT 分析堆快照 hprof,找内存泄漏根

Arthas 常用命令

dashboard # 总览:CPU、内存、GC、线程
thread -n 3 # CPU 最高的 3 个线程
thread -b # 找死锁
trace 类名 方法名 # 看方法内部各步骤耗时(定位慢在哪)


10.5 基础 JVM 参数(够用就好,别乱调)

-Xms4g -Xmx4g # 初始/最大堆,压测建议设相等,避免动态扩容抖动
-Xmn2g # 年轻代大小
-XX:+UseG1GC # 用 G1 垃圾回收器(JDK9+ 默认,推荐)
-XX:MaxGCPauseMillis=200 # G1 目标最大暂停时间
-XX:+HeapDumpOnOutOfMemoryError # OOM 时自动导出堆,便于事后分析
-XX:HeapDumpPath=/logs/heap.hprof

原则:先测出瓶颈再调参,别一上来就瞎调。-Xms=-Xmx 是压测最实用的一条。


10.6 调优实战套路

1. 压测中用 jstat -gc 观察 Full GC 频率
2. Full GC 频繁 → 看老年代是否回收不下去
├── 回收不下去 → 内存泄漏 → jmap 导堆用 MAT 分析
└── 能回收但太频繁 → 堆太小 → 适当加大 -Xmx
3. STW 时间长 → 换 G1/ZGC,调 MaxGCPauseMillis
4. 每次只改一个参数,重压对比,别一次改一堆


10.7 本章自测

  • 能画出 JVM 内存结构,说清年轻代/老年代。
  • 能区分 Minor GC 和 Full GC,知道为什么怕 Full GC。
  • 会用 jstat 看 GC、jmap 导堆、jstack 看线程。
  • 会用 Arthas 的 dashboard 和 trace。
  • 知道几个基础 JVM 参数的含义。

动手任务: 对自己的 Spring Boot 应用开一轮压测,全程用 jstat -gc <pid> 1000 观察,记录 Full GC 次数变化,并用 Arthas dashboard 截图。

✅ 学完进入 第 11 章:数据库性能优化实战。

赞(0)
未经允许不得转载:171主机测评 » 第 10 章:JVM 调优实战(Java 人的主场)
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址