VisualVM排查Java内存泄漏的核心是“看趋势、抓快照、查引用”:先观察堆内存阶梯式上升等异常趋势,再生成堆快照按实例数/大小定位可疑类,最后通过引用链分析静态字段、ThreadLocal等强引用源头。

用 VisualVM 实时监控排查 Java 内存泄漏,核心是“看趋势、抓快照、查引用”,不需要改代码、不依赖日志,关键在观察行为异常和定位强引用链。
启动并连接目标 JVM 进程
直接运行 jvisualvm.exe(JDK 8 及以前在 JDK_HOME/bin 下;JDK 9+ 需单独下载安装)。启动后左侧“本地”列表会自动列出本机所有 Java 进程。双击你要监控的应用(如 Spring Boot 启动的 jar 进程)。若进程未显示,确认它不是以 -Dcom.sun.management.jmxremote 等受限方式启动——默认情况下本地进程无需额外参数即可连接。
观察内存曲线识别泄漏迹象
切换到“监视”标签页,重点关注堆内存(Heap)曲线:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 正常应用:堆内存呈“锯齿状”波动,每次 GC 后明显回落
- 疑似泄漏:出现“阶梯式上升”,即每次 Full GC 后堆内存不回落或回落极少,且整体基线持续抬高
- 配合 VisualGC 插件(通过“工具 → 插件 → 可用插件”安装)可直观看到 Old 区缓慢但持续增长,Eden 区回收频繁但老年代始终清不干净
生成并分析堆快照(Heap Dump)
发现异常趋势后,立即点击“堆 Dump”按钮,生成 .hprof 文件。该快照记录了那一刻所有存活对象及其引用关系:
立即学习“Java免费学习笔记(深入)”;
- 在快照的“类”视图中,按“实例数”或“大小”降序排列,重点看数量异常多、总大小突增的自定义类(如
UserInfo、CacheEntry)或容器类(HashMap、ArrayList) - 右键可疑类 → “在实例视图中显示”,查看具体对象;再右键某个实例 → “引用的引用”(Referenced Objects)或“支配树”(Show in Dominator Tree),快速定位谁长期持有着它们
- 典型线索:静态字段(如
private static Map cache = new HashMap())、未清理的监听器、ThreadLocal 中未 remove 的值、缓存未设过期策略等
结合线程与采样缩小问题范围
内存泄漏常伴随特定操作反复触发。可同步使用:
- “线程”标签页:查看是否有长生命周期线程持续创建对象(如定时任务无限往静态集合 add)
- “抽样器”(Sampler)→ “内存”:开启后运行一段时间,查看哪些方法分配对象最多——能快速定位高频 new 操作的源头方法
- 若怀疑某次请求引发泄漏,可在请求前后各 dump 一次,用 MAT 或 VisualVM 自带的“比较”功能看新增对象差异

















