VisualVM通过堆内存整体行为反映对象生命周期,关键看“监视”中蓝色堆内存曲线:上升表持续分配,周期陡降为Minor GC正常信号,缓慢爬升趋平台或断崖下跌提示异常;结合“抽样器→内存”按字节排序定位高消耗类,双击查retained heap;堆Dump后用“引用的传入对象”回溯至静态字段或容器;VisualGC插件可观察Eden/S0/S1/Old区动态,Old单向增长且Full GC不回落即强泄漏信号。

VisualVM 不记录单个变量的赋值或修改,而是通过堆内存整体行为反映对象的创建、存活与回收过程。观察内存变化,关键在于理解曲线走势、分代分布和对象增长趋势,而不是追踪某一个字段。
看懂堆内存实时曲线
在“监视”选项卡中,点击“内存(Heap)”图表区域,蓝色曲线即为堆内存使用量随时间的变化:
- 曲线上升:说明应用正在持续分配新对象,比如循环创建大数组、缓存不断累积、集合未清理
- 周期性陡降:通常是 Minor GC 清理了新生代中大量短命对象,属于健康信号
- 缓慢爬升后趋于平台:老年代占用持续增加且 GC 后回落极少,需警惕对象过早晋升或泄漏
- 突兀断崖式下跌:可能是手动点击了右上角“执行 GC”,也可能是发生了 Full GC
识别高消耗对象类型
切换到“抽样器 → 内存”,点击“启动”,几秒后点“快照”,即可看到当前堆中各类对象的实例数与内存占比:
- 按“所占字节”排序,快速定位如 byte[]、HashMap$Node、String 或自定义业务类(如 Order、CacheEntry)是否异常庞大
- 双击某行,查看其浅堆(shallow heap)与保留集(retained heap)——后者代表该类所有实例及其引用链所占总内存
- 若某类实例数随时间推移只增不减,且 retained heap 持续扩大,大概率是引用链未释放,比如静态集合持有、监听器未注销、ThreadLocal 未清理
用堆转储回溯对象来源
当曲线明显异常上涨时,立即点击“堆 Dump”生成快照(.hprof 文件):
- 在堆转储视图中,用“类”筛选器输入目标类名(如 UserServiceImpl),右键 → “显示对象列表”
- 选中任意一个实例,右键 → “引用的传入对象”(Incoming References),逐层展开引用链
- 最终会定位到持有该对象的静态字段、线程局部变量或容器类(如 ConcurrentHashMap、ArrayList),再结合源码判断泄漏根源
借助 VisualGC 插件看清分代细节
安装 VisualGC 插件后,左侧出现分代视图,可直观观察各区域动态:
- Eden 区反复填满又清空:说明大部分对象生命周期极短,符合预期
- S0/S1 区频繁交换但对象不减少:部分对象躲过多次 Minor GC,正向老年代晋升
- Old 区单向增长、Full GC 后几乎无回落:强烈提示内存泄漏,应重点检查老年代中长期存活的对象类型

















