用JDK自带工具可零侵入监控JVM内存:jstat查实时使用率(如jstat -gcutil <pid> 2000显示E/O/M等百分比),jmap查堆结构快照(如jmap -heap <pid>含配置与GC类型),jcmd+NMT查堆外内存(需启动时加-XX:NativeMemoryTracking=summary)。

直接用 JDK 自带的命令行工具就能查清 JVM 各区域内存占用,不需要装额外软件,也不用改代码。关键看你想查“实时动态”还是“快照结构”,不同工具侧重点不同。
jstat:查实时使用率(推荐首选)
开销极低、不暂停应用,适合高频观察趋势:
- jstat -gcutil <pid> 2000:每 2 秒输出一行,直接显示 Eden(E)、Survivor(S0/S1 中活跃区)、老年代(O)、元空间(M)、压缩类空间(CCSU)的使用百分比
- jstat -gc <pid> 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 <pid>:输出新生代/老年代/元空间的配置(如 MaxHeapSize)、当前 used/total/max 及百分比,还标明 GC 类型(如 G1 GC)
- 若 Metaspace 使用率长期超 90%,配合 jmap -clstats <pid> 查类加载器数量和类总数,判断是否类泄漏
jcmd + NMT:查堆外内存(Direct/Mapped 等)
堆外内存(如 Netty 的 DirectByteBuffer)jstat/jmap 看不到,必须启用 Native Memory Tracking:
立即学习“Java免费学习笔记(深入)”;
- JVM 启动时加参数:-XX:NativeMemoryTracking=summary(生产环境够用)或 =detail(调试用)
- 运行中执行:jcmd <pid> 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 <pid>:单独监控该进程,看 RES(实际物理内存)是否持续上涨

















