)
第 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/YGCTMinor GC 次数 / 总耗时FGC/FGCTFull GC 次数 / 总耗时重点盯这个O老年代使用率一直接近 100% 且回收不下去 内存泄漏嫌疑jstack —— 看线程定位 CPU 高、死锁jstack pid thread.txt配合top -Hp pid找到高 CPU 线程 ID转 16 进制在 jstack 里搜。jmap —— 看内存定位内存泄漏jmap -histo pid | head -20 # 看对象数量排行 jmap -dump:formatb,fileheap.hprof pid # 导出堆快照用 MAT 分析10.4 可视化工具工具特点JVisualVMJDK 自带看堆/线程/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:MaxGCPauseMillis200 # 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 次数变化并用 Arthasdashboard截图。✅ 学完进入第 11 章数据库性能优化实战。