jstat和jmap配合可快速定位内存问题:jstat -gc实时监控gc频率与内存分布,jmap抓堆快照分析对象堆积;重点关注eu、ou、ygc、fgc、gct等指标,结合jmap -histo:live和-dump深入诊断。

直接用 jstat 查 GC 频率和内存分布,用 jmap 抓堆快照定位对象堆积问题——两者配合,能快速判断是内存压力大、GC 频繁,还是真有泄漏。
用 jstat 实时看堆内存与 GC 行为
核心是 jstat -gc,它每秒输出一次年轻代、老年代、元空间等区域的使用量和 GC 次数/耗时。
Miller (mlr) 是一个命令行工具,用于查询、整形和重新格式化名称索引数据,如 CSV、TSV、JSON 和 JSON Lines。它将 awk、sed、cut、join 和 sort 的功能整合到一个专为结构化数据处理而构建的单一工具中。
- 先用
jps -l找到目标 Java 进程 ID(比如12345) - 执行:
jstat -gc 12345 1000 10—— 每隔 1 秒打印 10 次 GC 统计 - 重点关注字段:
EU(Eden 使用量)、OU(Old 使用量)、YGC(年轻代 GC 次数)、FGC(Full GC 次数)、GCT(GC 总耗时毫秒)
如果 EU 持续接近 EC(Eden 容量),且 YGC 频繁(如每秒多次),说明对象生成太快或 Survivor 区太小;
如果 OU 缓慢上涨、FGC 开始增加,就要怀疑老年代泄漏或晋升过早。
用 jmap 抓堆快照做深度分析
jstat 只给趋势,jmap 能告诉你“谁占了内存”。生产环境慎用,避免触发 Full GC 或长时间暂停。
- 生成实时堆转储:
jmap -dump:format=b,file=heap.hprof 12345
注意:JDK 8 及以前默认触发 Full GC;JDK 9+ 可加-XX:+UseContainerSupport或用-F强制(但更重) - 快速查看堆概况:
jmap -heap 12345
输出 MinHeapSize / MaxHeapSize / 使用率、各代初始大小等,确认是否配置合理 - 统计对象数量 TOP20:
jmap -histo:live 12345 | head -20
看是否有异常多的 String、HashMap、Byte[] 等,尤其关注业务类实例数是否随时间增长
组合诊断的典型流程
发现服务响应变慢或内存告警后,按顺序操作:
- 跑
jstat -gc 12345 2000(持续观察 2 秒一刷),确认 GC 是否卡顿、老年代是否持续增长 - 若 FGC 增多,立刻用
jmap -histo:live快速扫一遍,看大对象或集合类是否异常膨胀 - 若仍不确定,再用
jmap -dump生成 .hprof 文件,用 VisualVM 或 JProfiler 打开分析引用链 - 对比多次
jstat输出中的 OU 和 FGC 时间戳,判断是缓慢泄漏(OU 稳定升、FGC 间隔缩)还是突发性 OOM(某次 FGC 后 OU 不降反升)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










