jstat、jmap、jcmd等jdk自带工具可实时查看jvm内存结构:jps查pid;jstat -gcutil看各代使用率;jmap -heap查堆配置;jstat -class/jstat -gc盯类加载与元空间;nmt配合jcmd查堆外内存。

Java 中 JVM 内存结构可通过 JDK 自带的一组命令行工具实时查看,无需额外安装,关键在于明确目标区域(堆、元空间、线程栈、本地内存等)并选用对应工具。下面按常用场景分项说明。
查进程 PID 和基础堆使用率(最快上手)
先确认目标 Java 进程 ID:
-
jps -l:列出所有 Java 进程及其主类或 JAR 路径,输出形如
12345 com.example.App - 拿到 PID(比如
12345)后,用 jstat -gcutil 12345 1000 5 每秒刷新一次,共 5 次,快速看各区域使用率 - 重点关注字段:E(Eden)、S0/S1(Survivor)、O(Old)、M(Metaspace) —— 数值持续接近 100% 且不回落,就是风险信号
看堆容量与当前占用(判断分配是否合理)
想知道“堆到底有多大、各代实际占了多少”:
- jstat -gccapacity 12345:显示 Eden、Survivor、Old 的最大容量(C)和当前已用容量(U),可对比看出是否长期低水位或频繁扩容
-
jmap -heap 12345:一次性输出完整堆配置,包括
MaxHeapSize、NewSize、OldSize、MetaspaceSize等,验证启动参数是否生效
查类加载与元空间(排查类泄漏、Metaspace OOM)
当应用动态生成类(如 Spring AOP、Groovy 脚本、OSGi),需盯紧类加载行为:
- jstat -class 12345:输出已加载类数(Loaded)、卸载类数(Unloaded)、耗时(Time)。若 Loaded 持续上涨、Unloaded 几乎为 0,大概率存在类泄漏
-
jstat -gc 12345 中的
MC(Metaspace Capacity)和MU(Metaspace Used)也同步关注,MU 接近 MC 且 FGCT 上升,说明元空间快满了
查堆外内存(RSS 比 -Xmx 大很多时必看)
Linux 下 top 显示 Java 进程 RSS 达 30G,但 -Xmx26g —— 多出的 4G 在哪?用 NMT:
- 启动时加参数:
-XX:NativeMemoryTracking=summary - 运行中执行:jcmd 12345 VM.native_memory summary,会分项列出 Thread、Code、Internal(含直接内存)、Arena Chunk 等开销
- 压测前后执行
jcmd 12345 VM.native_memory baseline+summary.diff,定位增长来源
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











