arthas是线上java内存泄漏排查最实用的动态诊断工具,支持不重启、不改代码、不中断服务下定位未回收对象及引用链,通过dashboard/jstat观察老年代趋势、vmtool查存活对象与静态字段、heapdump--live导出快照结合mat分析gc roots,并定向验证threadlocal、静态缓存、连接池等常见泄漏源。

Arthas 是线上 Java 内存泄漏排查最实用的动态诊断工具,核心价值在于不重启、不改代码、不中断服务的前提下,快速定位“该回收却没回收”的对象及其引用链。
看内存趋势与 GC 行为
先确认是否真有泄漏迹象,而不是瞬时高峰:
- 执行 dashboard,重点关注老年代(Old Gen)使用量是否持续上涨、GC 后不回落;线程数是否异常增长
- 运行 jstat -gc -h10
2000 ,观察 OU(老年代已用)是否逐轮上升、OGC(Full GC 次数)是否陡增 - 若每次 Full GC 后 OU 只下降一点点(如 1800M → 1790M),说明大量对象跨代晋升且无法释放,是典型泄漏信号
查高频存活对象与静态持有者
锁定可疑类和源头引用:
当用户要求为 Java 代码添加注释、修改注释、审查注释、整理注释格式,或要求按照代码注释规范处理 Java 文件时,使用本技能。本技能用于统一生成和维护 Java 类注释模板、按 Git 对比 release 判断版本号、补充每行代码上方中文块注释、调整注释空行规则,并保持 Java 文件 UTF-8 无 BOM 编码。典型触发场景包括:补充类注释、更新 @version、检查 @author 来源、整理行尾注释、把注释放到代码上一行、检查注释是否符合规范、构建前检查 Java 注释风格。
- 用 vmtool --action getInstances --className java.util.ArrayList --limit 5 查看某类当前存活实例(可替换为业务类,如 com.example.Order)
- 执行 vmtool --action getStaticField --className com.example.CacheManager --fieldName cacheMap 检查静态字段是否长期持有了未清理的集合
- 结合 sc -d *Cache* 确认类是否被重复加载,或存在 ClassLoader 泄漏风险
导出轻量快照并追踪 GC Roots
避免全量 dump 停顿,聚焦活跃对象:
- 在低峰期执行 heapdump --live /tmp/heap.hprof,加 --live 参数只导出可达对象,速度快、体积小
- 将文件拷贝到本地,用 MAT 打开后查看 “Leak Suspects” 报告,或手动执行 “Path to GC Roots” → “with all references”
- 重点看引用链中是否出现 ThreadLocal、static 缓存、未注销的监听器、或未 close 的流/连接
定向验证常见泄漏源
不靠猜,直接查高发场景:
- 执行 thread -n 5 列出 CPU 和活跃线程,再对每个业务线程(如 pool-OrderExecutor-1)运行 ognl '@java.lang.Thread@currentThread().getContextClassLoader()',检查是否持有不该持有的资源
- 查 ThreadLocal:用 ognl '#context=@org.springframework.web.context.request.RequestContextHolder@requestAttributesHolder.get()' 看是否残留了 Web 上下文
- 查数据库连接池:用 ognl '@com.zaxxer.hikari.HikariDataSource@getInstance().getHikariPool().getTotalConnections()' 验证连接是否堆积
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










