常用 JVM 参数
堆内存参数
元空间参数
栈参数
GC 相关参数
日志参数
其他常用参数
参数配置建议
通用建议
内存配置原则
| 场景 | 建议 |
|---|---|
| 普通应用 | 堆大小 = 可用内存的 50%-70% |
| 高并发应用 | 适当增大年轻代 |
| 低延迟应用 | 使用 G1 或 ZGC |
| 批处理应用 | 使用 Parallel GC,关注吞吐量 |
性能监控工具
命令行工具
jps - 查看 Java 进程
jstat - 查看 GC 统计
jinfo - 查看 JVM 参数
jmap - 内存映射
jstack - 线程堆栈
可视化工具
JConsole
- 内存监控
- 线程监控
- 类加载监控
- MBean 管理
VisualVM
- 性能分析
- 内存分析
- CPU 分析
- 线程分析
JMC(Java Mission Control)
更强大的性能分析工具,支持:- 飞行记录器(Flight Recorder)
- 实时监控
- 性能分析
常见问题排查
1. CPU 占用过高
排查步骤
常见原因
- 死循环
- 频繁 GC
- 正则表达式回溯
- 加密解密操作
2. 内存溢出(OOM)
堆内存溢出
- 内存泄漏
- 数据量过大
- 堆配置过小
元空间溢出
- 动态生成大量类
- 类加载器泄漏
直接内存溢出
- NIO 使用过多直接内存
3. GC 频繁
排查步骤
优化建议
| 现象 | 可能原因 | 解决方案 |
|---|---|---|
| Young GC 频繁 | Eden 区过小 | 增大年轻代 |
| Full GC 频繁 | 老年代过小或内存泄漏 | 增大堆或排查泄漏 |
| GC 后老年代占用高 | 存在大对象或内存泄漏 | 分析堆内存 |
4. 死锁
检测死锁
5. 线程阻塞
GC 日志分析
GC 日志示例
GC (Allocation Failure):GC 原因PSYoungGen: 65536K->10752K(76288K):年轻代 GC 前后大小(容量)65536K->10768K(251392K):堆 GC 前后大小(容量)0.0123456 secs:GC 耗时
GC 日志分析工具
- GCViewer:开源 GC 日志分析工具
- GCEasy:在线 GC 日志分析
- Gceasy.io:在线分析,生成可视化报告
调优案例
案例 1:Young GC 过于频繁
现象:每秒多次 Young GC 分析:案例 2:Full GC 频繁
现象:频繁 Full GC,老年代使用率高 分析:- 排查内存泄漏
- 增大堆内存
- 调整 GC 参数
案例 3:GC 停顿时间长
现象:GC 停顿超过 500ms 解决:小结
- 参数配置:根据应用特点合理配置堆大小、GC 收集器
- 监控工具:jps、jstat、jinfo、jmap、jstack
- 可视化工具:JConsole、VisualVM、JMC
- 常见问题:CPU 过高、OOM、GC 频繁、死锁
- 调优原则:
- 不要过早优化
- 基于数据分析,不要凭感觉
- 每次只调整一个参数
- 在测试环境验证后再上线