java垃圾回收监控以jdk自带工具为主,核心用jstat实时查看gc频率、耗时及原因,辅以visualvm可视化分析,结合jmap/jstack/日志定位内存泄漏与性能瓶颈。

Java 垃圾回收监控主要靠 JDK 自带工具和少量 GUI 工具,不依赖第三方依赖,开箱即用。核心目标是看清 GC 频率、耗时、内存分布及触发原因,从而快速定位吞吐下降、停顿过长或内存异常问题。
命令行主力:jstat —— 轻量、实时、生产首选
jstat 是最常用、最可靠的 GC 监控命令,无需改配置、不侵入应用,适合所有环境(包括容器内)。
- 先获取 Java 进程 PID:jps -l 或 ps -ef | grep java
- 查看基础 GC 统计(每秒刷新 5 次):jstat -gc
1000 5
关注字段:YGC/YGCT(年轻代回收次数与总耗时)、FGC/FGCT(Full GC 次数与总耗时)、E/U/O/OU(Eden 和老年代使用量) - 看触发原因(关键!):jstat -gccause
2000
输出如 Allocation Failure(Eden 满)、Metadata GC Threshold(元空间不足)、System.gc()(代码主动触发),直接指向根因 - 监控类加载是否异常:jstat -class
3000
若 loaded 持续上涨且 unloaded ≈ 0,大概率存在类泄漏(如 ThreadLocal 持有 ClassLoader) - 导出数据做趋势分析:jstat -gcutil
1000 > gc.log ,再用 Excel 或脚本绘图
可视化辅助:VisualVM + Visual GC 插件 —— 适合调试与教学
VisualVM 本身是 JDK 自带的图形工具(jvisualvm),配合插件可直观看到堆内存各区域动态变化。
- 启动后,在左侧“Applications”→“Local”下找到目标进程,双击进入
- 点击顶部“Plugins”,搜索安装 Visual GC 插件(需联网)
- 切换到“Visual GC”标签页,即可看到 Eden、S0/S1、Old、Metaspace 的实时占用与回收动画
- 结合“Monitor”页的堆内存曲线,能快速识别内存缓慢上涨(疑似泄漏)或周期性陡降(正常 GC)
- 注意:VisualVM 本身也是 Java 进程,可用来监控自己,但不建议在高负载生产环境长期运行
其他补充工具:按需选用
这些不是 GC 专用,但在关联分析时很有价值:
-
jmap -histo
:快速列出堆中对象数量 Top 20,判断是否某类对象暴增(如 HashMap$Node、String) -
jmap -dump:format=b,file=heap.hprof
:生成堆转储,用 JProfiler 或 Eclipse MAT 深度分析泄漏对象引用链 -
jstack
:当 GC 频繁但内存不高时,查是否有线程阻塞、死锁或大量线程创建(间接导致 GC 压力) - GC 日志(-Xlog:gc*):比 jstat 更完整,含每次 GC 的精确时间戳、晋升大小、失败原因等,适合归档分析
怎么看才有效?盯住这三点
别被满屏数字淹没,聚焦三个信号:
- YGC 频率突增:可能 Eden 太小、对象生命周期变短,或有短时大对象分配
- FGC 次数非零且增长:严重警告!检查元空间是否溢出、是否有大对象直接进老年代、CMS 是否并发失败、G1 是否 Evacuation 失败
- Old 区使用率缓慢爬升不回落:典型内存泄漏特征,配合 jmap -histo 和堆 dump 确认源头
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











