GC日志与Arthas是互补组合:日志定位问题类型和时间点,Arthas实时验证深挖根源;先通过GC日志识别Full GC、内存泄漏等现象,再用Arthas按线索精准排查类、方法及对象实例。

GC 日志和 Arthas 不是替代关系,而是互补组合:日志告诉你“发生了什么”,Arthas 告诉你“正在发生什么”以及“为什么发生”。两者结合,才能把一次 Full GC、内存缓慢泄漏或线程阻塞,从现象定位到具体类、方法甚至对象实例。
先看 GC 日志,锁定问题类型和时间点
GC 日志是回溯分析的起点。重点不是读全,而是快速抓关键信号:
-
看 GC 类型和频率:连续出现
Full GC (Metadata GC Threshold),说明元空间快满了,要查类加载器泄漏;若PSYoungGen频繁但ParOldGen持续上涨,大概率是对象过早晋升或内存泄漏 -
看 GC 原因(Cause):比如
Allocation Failure表示堆分配失败触发 Young GC;Ergonomics是 JVM 自适应调参触发;System.gc()则说明代码里有显式调用,需排查 -
记下关键时间戳:比如某次耗时 420ms 的 Full GC 发生在
2026-09-24T14:22:18.305,后续就用这个时间去 Arthas 查当时线程、堆状态
再用 Arthas 实时验证和深挖根源
日志指出方向后,Arthas 负责现场取证。不建议盲扫,按日志线索精准切入:
- 如果日志提示元空间增长异常 → 执行
vmtool --action getInstances --className java.lang.ClassLoader --limit 10,看是否有大量未释放的 ClassLoader 实例 - 如果老年代持续增长 → 先
dashboard观察堆使用趋势,再memory -h查各内存池,接着vmtool --action getInstances --className your.leaky.Object --limit 50统计可疑对象数量 - 如果某次 GC 后响应变慢 → 立即
thread -n 10查 CPU 占用最高的线程,再thread <id>看堆栈,确认是否卡在某个同步块或慢 SQL 上
联动操作:用日志时间反推 Arthas 快照
Arthas 本身不记录历史,但你可以用 GC 时间点做“锚定”:
立即学习“Java免费学习笔记(深入)”;
- 在 GC 日志中发现某次长时间停顿前 30 秒,Eden 区使用率突然冲到 98%,这时立刻执行
memory和dashboard,观察是否正处在 Young GC 高频期 - 配合
jad your.package.ServiceClass反编译关键业务类,确认近期上线的代码是否有大对象创建、静态集合误用或未关闭的流 - 若怀疑是某次批量任务引发,可用
trace your.package.BatchService execute动态追踪方法调用耗时与返回值,验证是否生成了超预期对象
补充:GC 日志 + Arthas 的典型诊断闭环
例如线上服务 RT 突增:
- 第一步:查 GC 日志 → 发现每 2 分钟一次 Full GC,原因
Allocation Failure,且老年代使用率从 30% 涨到 95% - 第二步:Arthas 连上 →
dashboard确认堆已满,memory --no-cache强制刷新看非堆内存是否也异常 - 第三步:针对性扫描 →
vmtool --action getInstances --className java.util.HashMap --limit 20,发现某个静态 Map 实例数达 12 万 - 第四步:定位代码 →
sc -d *HashMap*查加载位置,jad反编译对应类,确认是缓存未清理逻辑


















