arthas通过memory、heapdump、vmtool和ognl等命令无侵入式排查内存泄漏:先用dashboard和memory观察old gen持续增长及gc异常,再用vmtool统计可疑类实例数、ognl获取精确堆用量,接着heapdump生成hprof文件并用mat分析gc roots定位静态缓存等泄漏源头,最后结合watch/trace动态监控方法调用与对象生命周期。

Arthas 是阿里巴巴开源的 Java 诊断工具,特别适合在线上环境无侵入、实时地分析内存泄漏问题。它不需要重启应用,也不依赖源码或 debug 模式,通过 attach 到目标 JVM 进程即可开展深度排查。
快速定位内存占用异常的对象
内存泄漏通常表现为老年代持续增长、GC 后回收效果差、堆内存使用率居高不下。Arthas 提供了直观的内存概览和对象统计能力:
- 执行 dashboard 查看整体 JVM 运行状态,重点关注 heap usage、old gen usage 和 GC 次数/耗时,确认是否存在内存压力异常
- 用 vmtool --action getInstances --className java.lang.String --limit 10(可替换为疑似泄漏类)粗略查看某类实例数量,判断是否远超正常范围
- 运行 ognl '@java.lang.management.ManagementFactory@getMemoryMXBean().getHeapMemoryUsage()' 获取精确堆内存用量,辅助验证
抓取堆快照并分析对象引用链
仅看数量不够,关键要找到“谁在持有着这些对象”。Arthas 支持直接导出 hprof 文件,再配合 MAT 或 JProfiler 分析:
- 执行 heapdump /tmp/heap.hprof(需确保目标进程有写入权限),生成当前堆快照(注意:大堆可能耗时较长、占用磁盘空间)
- 将 heap.hprof 下载到本地,用 Eclipse MAT 打开 → “Leak Suspects Report” 快速定位可疑对象集合
- 在 MAT 中使用 Path to GC Roots → with all references 查看泄漏对象的强引用路径,重点识别静态容器、缓存、监听器、未注销的回调等常见泄漏源头
动态监控对象创建与引用关系
若泄漏发生频率低或难以复现,可结合 Arthas 的观测能力做实时追踪:
- 用 trace -j --skipJDK false com.example.CacheService put(替换为目标类方法)跟踪可疑方法调用栈和参数,确认是否重复 put 且未 remove
- 执行 watch com.example.UserManager createUser '{params, returnObj}' -x 3 观察对象创建时的上下文,辅助判断生命周期管理是否合理
- 对疑似静态集合(如 private static Map
cache ),用 ognl '#context.getBeansOfType(@org.springframework.context.ApplicationContext@class).iterator().next().getBean("cache")'(Spring 环境下)或直接 ognl '@com.example.GlobalCache@INSTANCE' 查看其实际内容和 size
验证修复与长期观察建议
定位并修复后,不能只靠一次 dump 就认为问题解决:
- 上线修复版本后,用 monitor -c 60 com.example.CacheService clean 监控清理方法是否按预期周期执行
- 持续运行 dashboard -i 5000(每 5 秒刷新)观察 old gen 趋势,确认不再持续攀升
- 建议在关键缓存/资源管理类中增加简单埋点,例如用 AtomicLong 记录当前活跃对象数,并通过 ognl 实时读取,便于快速感知异常
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











