生产环境java内存诊断首选arthas,轻量安全不重启,可实时监控、按需采集;辅以jmap低峰期快照;自动配置oom堆转储+mat离线分析闭环。

生产环境用 Java 内存诊断工具,核心是“轻量、安全、不重启、能定位”。不能像开发环境那样随便 dump 全堆或开 JMX 远程调试,得选对工具、抓准时机、控制影响。
优先用 Arthas 实时观察和按需采集
Arthas 是生产首选,非侵入、动态、权限可控。
- 启动后执行 dashboard,一眼看全:堆内存使用率、GC 次数、线程状态、加载类数
- 发现老年代涨得快,立刻执行 vmtool --action getInstances --className java.util.HashMap --limit 10,查大集合实例
- 怀疑某类对象暴增,用 ognl '@java.lang.management.ManagementFactory@getMemoryMXBean().getHeapMemoryUsage()' 获取实时堆用量
- 需要堆转储时,用 heapdump /tmp/heap.hprof(比 jmap 更稳定,不强制触发 Full GC)
jmap 配合低峰期手动快照
jmap 仍有效,但必须避开业务高峰,且只在必要时用。
- 先用 jps -l 定位 PID,再用 jstat -gc
2000 观察 2 秒一次的 GC 趋势,确认是否持续 Old 区增长 - 确认问题后,在流量低谷执行:jmap -dump:format=b,file=/tmp/heap_$(date +%s).hprof
- 若只想快速看对象分布,用 jmap -histo
| head -20 ,对比两次输出找新增类 - 注意:jmap -dump 会触发一次 Full GC,线上慎用;jmap -heap 则无此副作用,适合快速查堆配置
自动捕获 + 离线分析闭环
靠人工响应慢,关键服务建议提前配置自动兜底。
- JVM 启动参数加上:-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/data/dump/ -XX:+PrintGCDetails
- 生成的 .hprof 文件传到离线环境,用 Eclipse MAT 打开,重点看 “Leak Suspects” 报告和 “Dominator Tree”
- MAT 中筛选 Regex: java\.lang\.String|byte\[\]|char\[\],常能快速发现大缓存或日志堆积
- 结合 Thread Stack 和对象引用链,确认是哪个业务类长期持有对象(比如静态 Map、未清理的 ThreadLocal)
避免踩坑的几个关键点
工具本身不危险,误用才出事。
- 别在高峰期用 jmap -dump 或 jstack 全量抓取,可能卡住 JVM 几秒甚至更久
- Arthas 的 watch/trace 命令慎用于高频方法(如 toString、getter),容易拖慢吞吐
- 堆转储文件默认不压缩,10G 堆会生成 10G+ 文件,确保磁盘空间充足且路径可写
- 所有命令操作留痕,记录时间、PID、命令、输出摘要,便于回溯和协同排查
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











