Java JVM 调优实战指南:从入门到精通
JVM 调优是 Java 开发者必备的核心技能,合理的调优能显著提升应用性能和稳定性。
JVM 内存结构
JVM 内存主要分为以下几个区域:
┌─────────────────────────────────────┐
│ 方法区 (MetaSpace) │
├─────────────────────────────────────┤
│ 堆 (Heap) │
│ ┌─────────────┬─────────────────┐ │
│ │ 新生代 │ 老年代 │ │
│ │ Eden │ S0│S1│ │ │
│ └─────────────┴─────────────────┘ │
├─────────────────────────────────────┤
│ 虚拟机栈 / 本地方法栈 │
├─────────────────────────────────────┤
│ 程序计数器 │
└─────────────────────────────────────┘
常用 JVM 参数
堆内存设置
# 设置初始堆大小和最大堆大小
-Xms4g -Xmx4g
# 新生代大小
-Xmn2g
# 新生代与老年代比例
-XX:NewRatio=2
垃圾收集器选择
# G1 收集器(推荐 JDK 9+)
-XX:+UseG1GC
-XX:MaxGCPauseMillis=200
# ZGC(低延迟场景,JDK 11+)
-XX:+UseZGC
# CMS 收集器(JDK 8)
-XX:+UseConcMarkSweepGC
GC 日志分析
开启 GC 日志是调优的第一步:
# JDK 8
-XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:gc.log
# JDK 9+
-Xlog:gc*:file=gc.log:time,uptime:filecount=5,filesize=10M
常见问题排查
1. 内存溢出 (OOM)
// 堆内存溢出
java.lang.OutOfMemoryError: Java heap space
// 解决方案
-Xmx8g // 增大堆内存
-XX:+HeapDumpOnOutOfMemoryError // 生成堆转储文件
2. Full GC 频繁
可能原因:
- 老年代空间不足
- 元空间不足
- 显式调用 System.gc()
# 增大老年代
-XX:NewRatio=3
# 禁用显式 GC
-XX:+DisableExplicitGC
调优实战示例
针对 4 核 8G 服务器的推荐配置:
java -server \
-Xms4g -Xmx4g \
-XX:+UseG1GC \
-XX:MaxGCPauseMillis=100 \
-XX:+HeapDumpOnOutOfMemoryError \
-XX:HeapDumpPath=/logs/heapdump.hprof \
-Xlog:gc*:file=/logs/gc.log:time \
-jar app.jar
监控工具
| 工具 | 用途 | 特点 |
|---|---|---|
| jstat | GC 统计 | 轻量级 |
| jmap | 堆分析 | 生成 dump |
| jstack | 线程分析 | 死锁检测 |
| VisualVM | 综合监控 | 图形界面 |
| Arthas | 在线诊断 | 功能强大 |
总结
JVM 调优没有银弹,需要根据实际场景进行调整。记住:先监控分析,再针对性优化,避免盲目调参。