核心是用jstat -gc实时查看堆内存分区使用及GC状态:EU/EC(Eden)、S0U/S1U(Survivor)、OU/OC(老年代)、MU/MC(元空间)、CCSU/CCSC(压缩类空间),配合YGC/YGCT与FGC/FGCT判断GC压力。

Java 中查看 JVM 内存结构,核心是区分堆内(Heap)与堆外(Non-heap)内存,并通过 JDK 自带命令行工具分层定位。不需要图形界面、不依赖第三方应用,一条命令就能看到年轻代、老年代、元空间、代码缓存等关键区域的实际使用情况。
查整体堆结构和 GC 状态:jstat -gc
这是最常用、最轻量的实时查看方式,直接反映 JVM 堆内存分区使用和回收行为:
- 先用 jps 获取目标 Java 进程 PID(例如输出 12345 MyApp)
- 执行:jstat -gc 12345 1000 5 —— 每秒刷新一次,共打印 5 行
- 重点关注字段含义:
- EU/EC:Eden 区已用 / 总容量(年轻代主体)
- S0U/S1U:Survivor0/1 已用空间(存活对象中转区)
- OU/OC:老年代已用 / 总容量(长期存活对象)
- MU/MC:Metaspace(元空间)已用 / 容量(类元数据)
- CCSU/CCSC:压缩类空间(Compressed Class Space)使用量
- YGC/YGCT 和 FGC/FGCT:可判断是否频繁 Young GC 或 Full GC 压力大
查堆内存配置与当前参数:jmap -heap 和 jinfo
了解 JVM 启动时设定的内存边界,以及运行中实际生效的值:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- jmap -heap 12345:输出完整堆配置,包括 MinHeapFreeRatio、MaxHeapFreeRatio、各代初始/最大大小、GC 算法类型等
- jinfo -flags 12345:列出所有 JVM 启动参数(含 -Xms、-Xmx、-XX:MaxMetaspaceSize 等)
- jinfo -flag MaxHeapSize 12345:单独查最大堆大小(单位字节),可换算成 MB(÷1024÷1024)
查堆外内存(Native Memory):jcmd VM.native_memory
堆外内存不归 GC 管理,但容易被忽略。JDK 7u40+ 支持 native memory tracking(NMT),需启动时加参数:
立即学习“Java免费学习笔记(深入)”;
- 启动时必须开启:-XX:NativeMemoryTracking=summary(或 detail)
- 运行中执行:jcmd 12345 VM.native_memory summary
- 输出包含:Total: committed(已提交)、reserved(已保留)内存,以及按模块划分的使用(如 Thread、Class、GC、Internal、JIT 等)
- 若未开启 NMT,该命令会提示“Native memory tracking is not enabled”
查对象实例分布(辅助定位泄漏):jmap -histo
快速统计堆中各类对象数量与占用空间,适合初筛异常增长的类:
- jmap -histo:live 12345 | head -20:只统计可达对象(触发一次 Minor GC),显示前 20 行
- 关注列:num(实例数)、bytes(总字节数)、class name
- 常见线索:大量 byte[]、char[]、HashMap$Node、自定义 DTO 或缓存类持续增长
- 注意:生产环境慎用 -histo,可能引发短暂停顿;优先用 -histo:live

















