JVM内存监控关键在于观察内存使用模式、GC健康度与对象生命周期,首选jstat实时查看各区使用率及GC频次耗时,配合jmap定位分布、MAT分析堆快照定位泄漏根源。

监控 JVM 内存是调优的起点,关键不是堆大小设多大,而是看内存如何被使用、回收是否健康、对象生命周期是否合理。工具选对,问题才能看得清。
命令行工具:轻量、实时、适合线上
无需图形界面,不依赖远程连接,适合生产环境快速诊断:
-
jstat:最常用。用
jstat -gcutil <pid> 1000每秒刷新一次各内存区(Eden、S0/S1、Old、Metaspace)使用率和 GC 频次/耗时;jstat -gc <pid>查看具体容量与已用字节数,便于计算晋升速率或老年代增长斜率 -
jmap:定位内存分布。用
jmap -histo:live <pid>快速列出活跃对象数量与内存占比;jmap -dump:live,format=b,file=heap.hprof <pid>生成堆快照供深度分析 -
jcmd:JDK 7+ 推荐替代方案。
jcmd <pid> VM.native_memory summary可查本机内存(包括堆外);jcmd <pid> VM.native_memory detail定位 DirectBuffer 或 JNI 泄漏
可视化工具:直观、联动、适合分析
适合本地深入排查或复现问题后做归因分析:
- JConsole:JDK 自带,开箱即用。重点看“内存”面板中 Eden/Old 区曲线是否周期性回落(健康),或持续爬升(泄漏风险);“线程”页签可配合“检测死锁”一键触发
- VisualVM:功能更全。装上 VisualGC 插件后,能实时看到 Survivor 区复制、对象晋升、GC 类型切换;直接加载 jmap 生成的 hprof 文件,支持按包/类筛选对象、查看引用链
-
Arthas:线上诊断利器。
dashboard命令一屏显示内存、线程、GC 统计;vmtool --action getInstances --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader --className java.util.ArrayList可动态统计某类实例数,验证缓存膨胀假设
堆快照分析工具:定位泄漏根源
当发现老年代持续增长或频繁 Full GC,需靠堆快照确认“谁占了内存”:
- MAT(Memory Analyzer):打开 hprof 后,首选“Leak Suspects Report”,自动标记疑似泄漏点;用“Dominator Tree”看哪些对象直接支配最多内存;右键对象 → “Path to GC Roots” 查引用路径,确认是否被静态集合意外持有
- HeapHero:在线分析,上传 hprof 后自动识别重复字符串、大数组、未关闭流等典型模式,报告带修复建议
- PerfMa(笨马):国产工具,支持关联 GC 日志与堆快照,比如点击某次 Full GC 时间点,直接跳转到该时刻的堆状态,省去手动对齐时间成本
GC 日志分析工具:读懂回收行为
光看内存占用不够,得知道 GC 怎么工作的:
- 先启用日志:
-XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:/path/gc.log - GCEasy:上传 gc.log,自动生成吞吐量、停顿时间分布图、内存增长趋势,并标出“GC overhead > 98%”等高危信号
- GCViewer:离线桌面工具,适合对比不同参数下的 GC 行为;重点关注“Pause Time”柱状图是否出现长尾,以及“Allocation Rate”是否远超“Promotion Rate”(说明年轻代过小)


















