直接用命令组合实时监控Java进程CPU和内存:一、用top -o %MEM/%CPU或ps -eo pid,%cpu,%mem,rss,comm快速定位高耗进程;二、top -p <pid>动态盯梢;三、ps -mp <pid>+jstack定位高CPU线程;四、jstat -gc+jmap -heap分析JVM堆与GC状态。

直接用命令组合就能实时看到 Java 进程的 CPU 和内存消耗详情,重点不是“看一次”,而是“持续、准确、可定位”。下面分四类实用方式讲清楚。
一、快速定位高耗资源的 Java 进程
先筛出所有 Java 进程,并按内存或 CPU 排序:
- 按内存占用从高到低:`top -o %MEM -b -n 1 | grep java`
- 按 CPU 占用从高到低:`top -o %CPU -b -n 1 | grep java`
- 更清晰格式(含 PID、物理内存 KB、CPU%、内存%):
`ps -eo pid,%cpu,%mem,vsz,rss,comm --sort=-%mem | grep java | head -5`
注意:%CPU 是单核占比(8 核机器上显示 100% = 占满 1 个逻辑 CPU),不是整机 100%;RSS(Resident Set Size)才是真实占用的物理内存,比 VIRT 更有参考价值。
二、动态监控指定 Java 进程的资源变化
用 top -p <pid> 或 htop -p <pid> 进入进程专属视图:
立即学习“Java免费学习笔记(深入)”;
- 启动后按 F6 → 选择 %CPU 或 %MEM 可排序线程
- 按 H 切换线程/进程模式,查看 Java 应用内各线程的 CPU 消耗
- 若 htop 未安装:`sudo apt install htop`(Debian/Ubuntu)或 `sudo yum install htop`(CentOS/RHEL)
该方式适合人工盯梢——比如部署后观察 30 秒内是否有内存爬升或 CPU 尖峰。
三、线程级 CPU 分析:找出最耗 CPU 的 Java 线程
当某个 Java 进程 CPU 持续偏高,需定位具体线程:
- 查线程级 CPU 使用(按时间累计):
`ps -mp-o THREAD,tid,time | sort -k4nr | head -10` - 将高耗 TID 转为 16 进制:
`printf "%x\n"` - 用 jstack 匹配线程栈:
`jstack| grep "" -A 10`
这样就能直接看到是哪个线程(如 GC 线程、Netty EventLoop、业务 Runnable)在猛占 CPU。
四、JVM 堆内存与 GC 实时状态
系统级内存(RSS)高 ≠ JVM 堆内存高,必须分开看:
- 每秒刷新一次 GC 统计(共 5 次):
`jstat -gc1000 5`
关注 OU(老年代已用)、OC(老年代容量)、YGC/FGC 次数与耗时 - 查看堆配置与当前使用率:
`jmap -heap`
注意输出中的 “heap usage” 各代百分比,而非只看 “used” 数值 - 若怀疑 native 内存泄漏(如 DirectByteBuffer、JNI),可用:
`pstack` + `cat /proc/ /maps | awk '$6 ~ /\[heap\]|\[anon\]/ {sum += $2-$1} END{print sum/1024 " MB"}'`
特别提醒:Linux 的 free -h 中 available 才是真正可用内存;Java 进程 RSS 明显高于 MaxHeap,大概率是堆外内存或线程栈(-Xss)占用了。


















