jps:先找到是哪个 Java 进程
更新时间:2026-09-20。所有 JDK 在线诊断(jstack/jmap/jstat/jcmd)都要先拿 PID,
jps就是这一步的专用工具。拿到 PID 后的线程排查见 jstack 线程栈,万能命令见 jcmd。
一、为什么不用 ps
ps aux | grep java 在一台机器跑十几个 Java 服务时,全是冗长的 classpath 和 jar 名,很难分清谁是谁。jps 走 JVM 自身的进程机制,直接给「PID + 主类」:
bash
jps
# 12845 Jps
# 19312 AppMain
# 20480 quarkus-run.jar第一列 PID,第二列是主类简单名或可执行 jar 名;jps 自己也会出现一行。
二、四个最常用选项
| 命令 | 显示内容 |
|---|---|
jps | PID + 主类简单名/jar 名 |
jps -l | PID + 全限定主类名或 jar 完整路径(最常用) |
jps -m | 追加传给 main 的程序参数 |
jps -v | 追加 JVM 启动参数(-Xmx、系统属性等,排查配置极有用) |
jps -q | 只输出 PID(给脚本用) |
组合 jps -lvm 一次看全:哪个类、传了什么 main 参数、JVM 怎么配的。
bash
jps -lvm
# 19312 com.demo.AppMain -Xms1g -Xmx1g -Dspring.profiles.active=prod三、jps 看不到某进程的原因
jps 默认通过 /tmp/hsperfdata_<user>(Linux)下的共享内存文件枚举 HotSpot JVM,看不到通常是:
- 不是同一个用户:jps 只列当前用户的进程,用
sudo -u <user> jps或对应用户执行; - 进程启动加了
-XX:-UsePerfData,perfdata 文件没生成; /tmp被挂成noexec或 perfdata 目录被清理(部分容器/只读根文件系统);- 目标是容器里的 JVM,宿主机 jps 看不到 —— 进容器执行,或直接用
jcmd/jps在容器命名空间内; - 进程不是 HotSpot(罕见,如某些嵌入式 JVM)。
这些情况下退回用 ps -ef | grep java 或 pgrep -f <主类> 找 PID,再用 PID 喂给 jcmd。
四、典型用法串起来
bash
PID=$(jps -l | grep com.demo.AppMain | awk '{print $1}') # 脚本里取 PID
jstack -l "$PID" > t1.txt # 线程栈
jstat -gcutil "$PID" 1000 10 # GC 趋势
jcmd "$PID" GC.heap_dump /tmp/h.hprof # 堆转储同机能用本地连接(attach)时,jstack/jcmd 不需要额外开端口;远程才需要
-Dcom.sun.management.jmxremote之类配置。
总结
jps 用「PID + 主类名」快速定位本机 HotSpot 进程,是 jstack/jmap/jstat/jcmd 的第一步;-l 看全限定主类或 jar 路径、-m 看 main 参数、-v 看 JVM 参数,脚本里用 -q 只取 PID;它默认只列当前用户且依赖 hsperfdata 共享内存,跨用户、容器内、被 -XX:-UsePerfData 关闭或 /tmp 异常时会看不到进程,此时退回 ps/pgrep 找 PID,再进目标命名空间用 jcmd 诊断。