监控JVM内存需用jstat查各区域实时使用率(如E/O/M),jmap看堆配置与使用快照,NMT配合jcmd监控Direct/Mapped堆外内存,辅以JConsole、JMX或Arthas实现持续观测。

监控 JVM 内存各区域的实时使用率,核心是获取堆内(Eden、Survivor、Old)、堆外(Metaspace、Direct Memory、Code Cache)等关键区域的已用/总容量数据,并支持连续观测趋势。不需要侵入代码,JDK 自带工具就能完成,生产环境推荐轻量、低开销的方式。
用 jstat 查看各代内存实时占用率
jstat 是最常用、零依赖的命令行工具,适合快速查看 GC 状态和内存分布。它不触发 Full GC,开销极低:
-
jstat -gc <pid> 1000 5:每秒输出一次,共 5 次。显示 Eden、S0/S1、Old、Metaspace 的U(used)、C(capacity)、YGC/FGC等。使用率 =U / C × 100% -
jstat -gcutil <pid> 2000:每 2 秒输出一行,直接显示各区域使用百分比(如E=Eden,O=Old,M=Metaspace),更直观 - 注意:Survivor 区显示的是“当前正在使用的那个”,即 S0 或 S1 中的活跃区;Old 区增长缓慢但持续上升,可能预示对象晋升过快或内存泄漏
用 jmap 快速查看堆内存整体分布
jmap -heap 提供一次性快照,包含新生代/老年代/元空间的配置值与实时使用情况,适合排查配置是否合理:
-
jmap -heap <pid>输出中会明确列出:
– Heap Configuration(初始、最大、使用上限)
– Heap Usage(各代当前 used/total/max,含百分比)
– GC 算法类型(如 G1 GC、ZGC) - 该命令会触发一次全局安全点暂停(毫秒级),不建议高频执行,但比 jstat 更全面展示分区结构
- 若看到 Metaspace 使用率长期 >90%,需检查是否类加载过多或未卸载,可配合
jmap -clstats <pid>查类加载器统计
监控堆外内存(尤其是 Direct Buffer)
堆外内存不被 jstat/jmap 覆盖,需启用 Native Memory Tracking (NMT):
立即学习“Java免费学习笔记(深入)”;
- 启动 JVM 时添加参数:
-XX:NativeMemoryTracking=summary(轻量)或=detail(含调用栈) - 运行中执行:
jcmd <pid> VM.native_memory summary,输出包括:
– Java Heap(与 jstat 对齐)
– Class(元空间+常量池)
– Thread(线程栈内存)
– Internal(JVM 内部结构)
– Direct(ByteBuffer.allocateDirect 分配量)
– Mapped(MappedByteBuffer 占用) - 重点关注
Direct和Mapped增长是否异常——Netty、NIO 文件读写、大缓存场景易出现泄漏
图形化与长期可观测性补充
单次命令适合排查,持续监控建议结合以下方式:
- JConsole / VisualVM:连接本地或远程 JVM,内存页签自动绘制堆/非堆曲线,支持手动触发 GC 并观察回收效果
-
JMX + Prometheus + Grafana:通过
java.lang:type=MemoryPool,name=*等 MBean 指标采集各内存池的Usage.used和Usage.max,计算并告警使用率 -
Arthas memory 命令:对已接入 Arthas 的应用,输入
memory可交互式查看各区域详细占比,支持memory -h查帮助,适合线上临时诊断


















