线上Java内存泄漏排查首选JVM命令行工具组合:jstat实时监控GC异常(OU持续升、FGC陡增),jmap -histo:live定位膨胀类,jmap -dump:live导出快照供MAT分析GC Roots路径,全程免安装、低开销、生产友好。

线上 Java 应用一旦出现内存泄漏,往往表现为老年代持续增长、Full GC 频繁、响应变慢甚至 OOM。排查不能靠猜,得靠工具组合——既要能快速捕获异常信号,又要能精准定位泄漏对象。下面从适用阶段、核心能力、部署成本、生产友好性四个维度,对比主流工具的实际表现。
命令行工具:轻量实时监控,适合初筛
这类工具自带、免安装、低开销,是线上第一道防线:
- jstat:每秒看 GC 趋势,重点关注 OU(老年代使用率)持续上升 + FGC 次数陡增,5 秒内可判断是否疑似泄漏;不依赖堆转储,但无法定位对象。
- jmap -histo:live:输出存活对象数量与大小排名,快速发现“异常多的类”(如某业务 DTO 实例达百万级);比生成完整 dump 快得多,适合高频快照比对。
- jmap -dump:live:生成 .hprof 文件,是后续深度分析的前提;加 live 参数避免包含已死亡对象,减小文件体积和分析干扰。
MAT:堆转储分析主力,开源免费,强于根因定位
专为 .hprof 文件设计,适合在问题复现后离线深挖:
- 打开 dump 后首选 Leak Suspects Report,自动标出前几大可疑对象及保留集大小(Retained Heap);
- 用 Dominator Tree 查看谁占了最多 Retained Heap,再点开“Path to GC Roots”看引用链——比如发现某个 static Map 持有 20 万订单对象,且 GC Roots 显示是 ClassLoader → 类静态字段,基本坐实泄漏点;
- 不支持实时监控,也不能跟踪对象分配路径,纯靠事后静态分析。
VisualVM / JConsole:开发调试友好,生产慎用
图形化、集成度高,适合测试环境或低峰期临时接入:
立即学习“Java免费学习笔记(深入)”;
- VisualVM 可直接连远程 JVM(需开启 JMX),实时看堆内存曲线、生成 dump、查看线程,插件还能装 Visual GC;
- 但默认开启会带来约 5%~10% 性能损耗,且 JMX 端口暴露存在安全风险,不建议长期开启于核心生产服务;
- JConsole 更轻量,但分析能力弱于 VisualVM,适合快速确认内存/线程基础状态。
商业 Profiler(JProfiler / YourKit):全链路追踪,适合复杂场景
当泄漏隐蔽(如分配热点分散、弱引用误用、线程局部变量堆积),需要更精细视角:
- 支持 Allocation Recording:记录某段时间内所有对象分配位置(精确到代码行),直接看到“谁在疯狂 new”;
- 可设置 内存阈值告警,自动触发 dump;支持离线分析快照,对运行中服务影响可控;
- 引用图谱可视化更直观,能一键跳转到持有引用的代码上下文,缩短定位时间;
- 代价是授权费用,且 agent 注入仍有一定开销,需评估业务容忍度。
辅助工具:补位关键环节
单独用效果有限,但配合主工具能提升效率:
- GCViewer:解析 -Xloggc 输出的日志,画出 GC 时间线、停顿分布、晋升失败次数,帮判断是否因 CMS/ParNew 配置不当引发假性泄漏;
- Java Flight Recorder(JFR):JDK 自带,低开销录制运行时事件(包括对象分配、GC、锁竞争),配合 JDK Mission Control 分析,适合长周期观察模式;
- Arthas:非内存专用,但可通过 vmtool --action getInstances 按类查实例数,或动态 watch 方法返回值,快速验证某对象是否被意外缓存。


















