Arthas排查Java内存泄漏的核心流程是:先用dashboard -i 2000和memory观察老年代持续增长且Full GC不回落,再执行heapdump --live导出存活对象快照,最后通过MAT的Leak Suspects Report、Histogram及Path to GC Roots定位强引用源头。

Arthas 排查 Java 内存泄漏,核心是“先看趋势、再抓快照、后分析根因”,不需重启应用,全程线上操作。
快速识别内存异常增长
连接目标进程后,优先执行:
- dashboard -i 2000:每2秒刷新一次,重点关注 HEAP → Old Gen 是否持续上升、Full GC 后不回落;
- memory:单独查看各内存池(如 g1_old_gen、metaspace)的 used/usage 值,多次执行对比变化;
- 若发现老年代占用稳步上涨且 GC 无效,基本可判定存在内存泄漏。
导出堆快照定位大对象
确认异常后,立即生成堆转储文件:
- heapdump --live /tmp/dump.hprof:加 --live 只保留存活对象,文件更小、分析更准;
- 建议在泄漏明显时(如 Old Gen 达到 80%+)和之前稳定时刻各 dump 一次,用于对比;
- 注意路径要有写权限,且磁盘空间充足(通常几百 MB 到几 GB)。
结合 MAT 分析泄漏对象
将 .hprof 文件用 Eclipse Memory Analyzer(MAT)打开:
- 点开 Leak Suspects Report,自动标出最可疑的几个对象组;
- 查看 Histogram,按 “Retained Heap” 降序,找数量多、单个或批量占内存大的类(如 ArrayList、HashMap、自定义缓存容器);
- 对高嫌疑对象右键 → Path to GC Roots → exclude weak/soft references,看谁在强引用它——源头通常就在这一链路上。
在线辅助验证与追踪
若已缩小范围到某个类或方法,可用 Arthas 实时验证:
- vmtool --action getInstances --className com.example.CacheHolder --limit 5:查实例数是否随时间暴增;
- trace com.example.CacheHolder init:追踪构造或初始化逻辑,确认调用频次和上下文;
- ognl '@java.lang.Runtime@getRuntime().totalMemory()':手动检查 JVM 内存总量变化,交叉验证。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











