JVM 性能调优指南:堆内存、GC 日志分析
JVM 调优是 Java 应用性能优化的重要环节。
堆内存结构
堆内存
├── 新生代 (Young Generation)
│ ├── Eden (80%)
│ ├── Survivor0 (10%)
│ └── Survivor1 (10%)
├── 老年代 (Old Generation)
└── 元空间 (Metaspace)
堆内存配置
# 堆大小
-Xms4g -Xmx4g
# 新生代大小
-Xmn2g
# 新生代比例
-XX:NewRatio=2
# Survivor 比例
-XX:SurvivorRatio=8
# 元空间
-XX:MetaspaceSize=256m
-XX:MaxMetaspaceSize=256m
GC 日志分析
开启 GC 日志
# Java 9+
-Xlog:gc*:file=gc.log:time,uptime,level,tags
# Java 8
-XX:+PrintGCDetails
-XX:+PrintGCDateStamps
-Xloggc:gc.log
日志分析工具
- GCEasy:在线分析
- GCViewer:本地分析
- JVisualVM:实时监控
关键指标
| 指标 | 说明 | 目标 |
|---|---|---|
| GC 频率 | GC 次数/分钟 | < 10 |
| GC 停顿 | 每次 GC 停顿时间 | < 200ms |
| Full GC 频率 | Full GC 次数/小时 | < 1 |
常见问题
1. 频繁 Full GC
原因: 老年代空间不足
解决:
# 增加堆内存
-Xms8g -Xmx8g
# 增加老年代比例
-XX:NewRatio=3
2. GC 停顿时间长
原因: 对象太多,收集器不合适
解决:
# 使用 G1
-XX:+UseG1GC
-XX:MaxGCPauseMillis=200
# 使用 ZGC
-XX:+UseZGC
3. 内存泄漏
排查:
# 导出堆内存
jmap -dump:format=b,file=heap.hprof <pid>
# 使用 MAT 分析
调优步骤
- 监控:收集 GC 日志、性能指标
- 分析:找出瓶颈
- 优化:调整参数或代码
- 验证:测试优化效果
最佳实践
- 设置 -Xms = -Xmx:避免动态扩缩容
- 选择合适的收集器:根据场景选择
- 定期分析 GC 日志:发现潜在问题
- 避免内存泄漏:检查资源释放
总结
JVM 调优需要结合具体场景。通过监控、分析、优化,可以提升应用性能。