用jdk自带工具可零侵入监控jvm内存:jstat查实时使用率(如jstat -gcutil 2000显示e/o/m等百分比),jmap查堆结构快照(如jmap -heap 含配置与gc类型),jcmd+nmt查堆外内存(需启动时加-xx:nativememorytracking=summary)。

直接用 JDK 自带的命令行工具就能查清 JVM 各区域内存占用,不需要装额外软件,也不用改代码。关键看你想查“实时动态”还是“快照结构”,不同工具侧重点不同。
jstat:查实时使用率(推荐首选)
开销极低、不暂停应用,适合高频观察趋势:
-
jstat -gcutil
2000 :每 2 秒输出一行,直接显示 Eden(E)、Survivor(S0/S1 中活跃区)、老年代(O)、元空间(M)、压缩类空间(CCSU)的使用百分比 -
jstat -gc
1000 5 :每秒一次,共 5 次,显示各区域已用字节数(U)、总容量(C),自己算百分比:U / C × 100% - 注意:Survivor 显示的是当前使用的那个区(S0 或 S1),Old 区缓慢持续上涨需警惕晋升异常或泄漏
jmap:查堆结构快照(看配置与分布)
获取一次性详细分区信息,含初始值、最大值、当前用量和算法类型,但会触发短暂安全点暂停:
当用户要求为 Java 代码添加注释、修改注释、审查注释、整理注释格式,或要求按照代码注释规范处理 Java 文件时,使用本技能。本技能用于统一生成和维护 Java 类注释模板、按 Git 对比 release 判断版本号、补充每行代码上方中文块注释、调整注释空行规则,并保持 Java 文件 UTF-8 无 BOM 编码。典型触发场景包括:补充类注释、更新 @version、检查 @author 来源、整理行尾注释、把注释放到代码上一行、检查注释是否符合规范、构建前检查 Java 注释风格。
-
jmap -heap
:输出新生代/老年代/元空间的配置(如 MaxHeapSize)、当前 used/total/max 及百分比,还标明 GC 类型(如 G1 GC) - 若 Metaspace 使用率长期超 90%,配合 jmap -clstats
查类加载器数量和类总数,判断是否类泄漏
jcmd + NMT:查堆外内存(Direct/Mapped 等)
堆外内存(如 Netty 的 DirectByteBuffer)jstat/jmap 看不到,必须启用 Native Memory Tracking:
- JVM 启动时加参数:-XX:NativeMemoryTracking=summary(生产环境够用)或 =detail(调试用)
- 运行中执行:jcmd
VM.native_memory summary scale=MB ,重点关注 Direct 和 Mapped 行的 committed 值 - Direct 内存异常增长常见于未 clean() 的 ByteBuffer、NIO 文件读写、大缓存池未回收
补充:快速定位高内存 Java 进程
先确认是哪个 Java 进程占得多,再查其 JVM 内存:
- ps -eo pid,ppid,cmd,%mem,rss --sort=-rss | head -10:按物理内存(RSS)倒序列出前 10 进程
- jps -lv:列出所有 Java 进程 PID 和完整启动参数,方便核对是否启用了 NMT 等诊断选项
-
top -p
:单独监控该进程,看 RES(实际物理内存)是否持续上涨
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










