java堆内存用于对象实例,由gc管理,监控重点为使用量与gc行为;非堆内存含元空间等,不受gc管理;堆外内存需通过nmt单独监控。

堆内存监控:看对象分配与 GC 行为
堆内存专用于存放 Java 对象实例(new 出来的对象、数组等),由垃圾收集器(GC)统一管理。监控重点是使用量、GC 频次与耗时。
-
命令行工具:用
jstat -gc <pid></pid>查看 Eden、Survivor、Old 区的已用/容量、GC 次数及时间;jmap -heap <pid></pid>输出堆配置与当前使用摘要 - 图形化工具:JConsole 或 VisualVM 的“内存”页签中,“Heap Memory Usage”曲线即堆使用趋势,配合“VM Summary”可看到初始大小(-Xms)、最大值(-Xmx)
-
代码内获取:调用
ManagementFactory.getMemoryMXBean().getHeapMemoryUsage()获取已用、最大、提交等数值(单位字节)
非堆内存监控:盯住元空间、代码缓存与常驻结构
非堆内存(Non-heap)是 JVM 自身运行所需区域,不存业务对象,主要包括元空间(Metaspace)、代码缓存(Code Cache)、压缩类空间(Compressed Class Space)等。它不受 GC 管理,但会因类加载过多或 JIT 编译膨胀而持续增长。
-
命令行工具:用
jstat -gccapacity <pid></pid>和jstat -compiler <pid></pid>分别查看元空间容量、已用大小及 JIT 编译统计;jstat -gc <pid></pid>中的MU(Metaspace Used)列即元空间已用量 - 图形化工具:JConsole 的“内存”页签下,“Non-heap memory usage”区域会拆分为 Metaspace、Compressed Class Space、Code Cache 三块,各自有独立曲线
-
代码内获取:调用
ManagementFactory.getMemoryMXBean().getNonHeapMemoryUsage()可得整体非堆用量;更细粒度需用MemoryPoolMXBean遍历各内存池(如 "Metaspace", "CodeHeap 'non-nmethods'")
堆外内存(Direct Memory)要单独看,不算在非堆里
注意:ByteBuffer.allocateDirect() 分配的是堆外内存(Off-heap),它既不属于堆,也不属于非堆——它是直接向操作系统申请的本地内存(C heap),JVM 不自动回收,容易被忽略导致 OOM。
- 启用 Native Memory Tracking(NMT):启动 JVM 时加参数
-XX:NativeMemoryTracking=summary(或detail),再用jcmd <pid> VM.native_memory summary</pid>查看 Direct Memory 实际占用 - JConsole / VisualVM 默认不显示堆外内存,必须依赖 NMT 或第三方探针(如 Prometheus + jvm-exporter 配合
jvm_buffer_*指标)
关键参数对照表,便于排查时快速定位
堆内存相关:-Xms、-Xmx、-XX:NewRatio、-XX:MaxGCPauseMillis
非堆内存相关:-XX:MaxMetaspaceSize(强烈建议显式设置)、-XX:InitialCodeCacheSize、-XX:ReservedCodeCacheSize
堆外内存相关:-XX:MaxDirectMemorySize(默认等于 -Xmx,不设易失控)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











