arthas可无侵入排查java内存泄漏:先用dashboard/jvm确认堆持续增长及gc异常,再通过vmtool/heapdump定位异常对象,接着用getreferencechain追踪强引用链至静态缓存或threadlocal等典型泄漏源,最后用watch/trace动态验证。

Arthas 是阿里巴巴开源的 Java 诊断工具,特别适合线上环境无侵入式排查内存泄漏。核心思路是:先确认内存是否真在泄漏(堆持续增长、GC 后无法回收),再定位异常对象及其引用链,最后结合代码分析源头。
一、快速确认是否存在内存泄漏
登录线上机器,用 Arthas attach 到目标 JVM 进程后,执行以下命令观察内存趋势:
- dashboard:实时查看堆内存使用量、GC 次数与耗时、线程状态。重点关注“heap usage”是否随时间单向上升,且 Full GC 后仍居高不下;
- jvm:检查 JVM 启动参数,确认 -Xmx 设置是否合理,以及是否启用了 G1 或 ZGC 等现代垃圾收集器;
- vmtool --action getInstances --className java.lang.OutOfMemoryError --limit 5(可选):若已发生 OOM,可尝试抓取最近的 OOM 实例线索(需开启 -XX:+HeapDumpOnOutOfMemoryError)。
二、定位内存中数量异常或体积过大的对象
使用 ognl 和 vmtool 查看堆内对象分布:
- vmtool --action getInstances --className com.example.User --limit 10:查看指定类的实例数量和部分字段,判断是否某类对象明显堆积;
- vmtool --action getInstances --className java.util.HashMap --limit 1:结合业务常见容器(如 HashMap、ArrayList、ConcurrentHashMap),检查其 size 是否异常大;
- ognl '@java.lang.management.ManagementFactory@getMemoryMXBean().getHeapMemoryUsage()':获取精确堆内存用量,辅助比对;
- 更高效方式:heapdump /tmp/heap.hprof 生成堆快照(注意磁盘空间和暂停时间),再用 MAT 或 JProfiler 离线分析——Arthas 本身不提供图形化分析,但 dump 是关键输入。
三、追踪对象的强引用链(关键步骤)
找到可疑对象后,必须查清“谁在持有着它”,否则无法修复:
- 先用 vmtool --action getInstances --className com.example.CacheEntry --limit 1 获取一个实例的 hashCode(例如 0x7a8b9c);
- 再执行:vmtool --action getStaticField --className com.example.GlobalCache --fieldName instance,确认静态缓存是否持有该对象;
- 核心命令:vmtool --action getReferenceChain --objectID 0x7a8b9c --level 5,输出从 GC Root 到该对象的完整强引用路径(如:static field → ConcurrentHashMap → Node → value → CacheEntry);
- 若引用链中出现 ThreadLocal、static 集合、未关闭的监听器、自定义 ClassLoader 等典型泄漏源,基本可锁定问题模块。
四、结合运行时行为动态验证
避免“静态快照误判”,用 Arthas 实时观测对象生命周期:
- watch com.example.service.UserService createCacheEntry '{params,returnObj}' -n 5:监控对象创建入口,确认是否高频新建且未释放;
- trace com.example.cache.CacheManager put -n 10:跟踪缓存写入逻辑,看 key 是否未规范设计(如含时间戳/UUID 导致无法命中)、value 是否未做大小限制;
- monitor -c 5 com.example.cache.CacheManager size:每 5 秒统计一次缓存 size,观察是否只增不减。
整个过程无需重启、无需改代码、不依赖日志埋点。重点在于“先看趋势、再查对象、必追引用链、辅以行为观测”。只要引用链能打穿到某个静态容器或 ThreadLocal,修复方向就非常明确。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











