jstat通过-gc和-gccapacity等选项实时监控JVM堆内存各区域使用量及GC状态,配合采样间隔(如1000ms)持续输出数值,结合EU/OC、OU/OC、MU/MC等字段可识别Eden增长、老年代泄漏或Metaspace类泄漏趋势。

使用 jstat 实时监控 JVM 堆内存各区域(如 Eden、Survivor、Old、Metaspace)的垃圾回收状态和内存增长趋势,核心在于选择合适的选项、设置合理的采样间隔,并结合输出字段理解内存动态变化。
明确 jstat 的关键参数组合
jstat 本身不画曲线,但能持续输出数值,配合终端滚动或重定向到文件后用工具绘图(如 gnuplot、Excel),即可生成增长/回收曲线。最常用的是以下两类模式:
- -gc:显示所有堆内存区域容量、已用空间、GC 次数与耗时(含 Young GC 和 Full GC)
- -gccapacity:显示各代初始/当前/最大容量,用于判断是否发生扩容
- 加上 pid interval[ms](如
1000)可每秒刷新一次,实现“实时”观测
读懂 jstat -gc 输出的关键字段
以 jstat -gc <pid> 1000 为例,重点关注以下列(不同 JDK 版本列名略有差异,以 JDK 8/11 为主):
- S0C / S1C:当前 Survivor 0/1 区容量(KB),大小通常相等
- EC:Eden 区容量;EU:Eden 已用空间 → EU/EC 即 Eden 使用率
- OC:Old 区容量;OU:Old 已用空间 → OU/OC 是老年代压力指标
- MC / MU:Metaspace 容量与已用(JDK 8+),长期上升可能预示类泄漏
- YGC / YGCT:Young GC 次数与总耗时(秒),频率突增说明对象短命或 Eden 过小
- FGC / FGCT:Full GC 次数与总耗时,出现即需警惕(尤其是频繁 FGC)
识别内存增长与 GC 异常模式
观察连续输出时,注意三类典型现象:
DMap GL地图JSAPI(dmapgl)开发指南。用于编写、审查、调试 DMap 地图 API 代码,涵盖地图初始化、覆盖物渲染、图层管理、事件处理、控件交互等任务。当用户提及 dmap、dmapgl、jsapi‑gl 或相关地图开发需求时自动触发。
立即学习“Java免费学习笔记(深入)”;
- Eden 持续缓慢上涨 + YGC 频繁:可能是对象分配速率高,或 Survivor 区过小导致提前晋升
-
OU 稳步上升且不下降:老年代内存泄漏嫌疑大,结合
jmap -histo或堆 dump 分析存活对象 - MC 缓慢但持续增长:动态生成类(如 Groovy、CGLIB、JSON 反序列化框架)未释放,检查类加载器生命周期
- YGCT 或 FGCT 单次飙升:某次 GC 耗时异常(如 Old 区碎片严重、CMS concurrent mode failure)
实用技巧提升监控效率
单靠肉眼刷屏易遗漏细节,建议搭配简单命令增强可读性:
- 加
-h10每 10 行重复表头:jstat -gc -h10 <pid> 2000 - 用
awk提取关键列并格式化(例如只看 EU、OU、YGC、FGC):jstat -gc <pid> 1000 | awk '{print $3, $5, $10, $13}' - 重定向到 CSV 文件供后续绘图:
jstat -gc <pid> 1000 60 > gc_log.csv(采集 60 秒) - JDK 9+ 支持
-J-Djava.util.logging.config.file=...配合jstatd远程采集,但本地调试推荐直接jstat
不复杂但容易忽略:jstat 的时间单位是毫秒,-gc 输出中的 GC 耗时(YGCT/FGCT)是累计值,差值才反映单次耗时;真正要画“曲线”,必须定时采集并记录时间戳,再用外部工具拟合趋势。

















