jps (Java Virtual Machine Process Status Tool) 是一个 Java 开发工具箱中非常实用的命令行工具,它的主要作用是列出当前正在运行的 Java 虚拟机(JVM)进程及其主类(Main Class)的名称。

jps 命令简介
jps 命令非常轻量级,它不提供像 jstat 或 jstack 那样详细的 JVM 内部信息,但它能快速帮你找到正在运行的 Java 进程 ID,这是进行后续 JVM 调优和问题排查的第一步。
命令位置
jps 命令通常位于 Java 的安装目录下的 bin 文件夹中。
- JDK:
$JAVA_HOME/bin/jps - JRE:
$JAVA_HOME/bin/jps
这个目录会被添加到系统的 PATH 环境变量中,所以你可以在任何地方直接使用 jps 命令。
基本语法
jps [options] [hostid]
[options]: 可选参数,用于控制输出格式。[hostid]: 可选参数,用于查看远程主机上的 JVM 进程(需要配合 RMI 服务,不常用)。
常用选项
jps 的选项不多,但非常实用。

| 选项 | 全称 | 描述 |
|---|---|---|
-q |
--quiet |
只输出本地 JVM 的进程 ID(LVMID),不显示主类名。 |
-l |
--long |
输出主类的完整包名(JAR 包启动,则输出 JAR 文件的完整路径)。 |
-m |
--main-class |
输出传递给 main 方法的参数。 |
-v |
--vm-flags |
输出传递给 JVM 的 JVM 参数(-Xms, -Xmx 等)。 |
不带任何选项的 jps 是最常用的形式,它会同时显示进程 ID 和主类名(或 JAR 文件名)。
使用示例
假设你的 Linux 系统上运行了几个 Java 程序。
基本用法
直接输入 jps,它会列出当前用户有权查看的所有本地 Java 进程。
$ jps 1234 Jps 5678 MyApplication 9012 org.apache.catalina.startup.Bootstrap
1234: 进程 ID (LVMID)Jps:jps工具自身也是一个 Java 进程。5678: 另一个 Java 应用的进程 ID。MyApplication: 该应用的主类名。9012: Tomcat 服务器的进程 ID。org.apache.catalina.startup.Bootstrap: Tomcat 的启动类。
使用 -q 选项
如果你只想获取进程 ID,而不关心类名。

$ jps -q 1234 5678 9012
使用 -l 选项
查看主类的完整路径或 JAR 包的完整路径。
$ jps -l 1234 /usr/lib/jvm/java-11-openjdk-amd64/bin/jps 5678 /home/user/myapps/MyApplication.jar 9012 /opt/apache-tomcat-9.0.50/bin/bootstrap.jar
- 对于 JAR 包启动的程序,会显示 JAR 文件的绝对路径。
- 对于 Tomcat 这样的服务器,会显示其核心 JAR 文件的路径。
使用 -m 选项
查看应用启动时传递给 main 方法的命令行参数。
假设你的 MyApplication 是这样启动的:
java -jar MyApplication.jar --config=/etc/app.conf --mode=prod
运行 jps -m 会显示:
$ jps -m 5678 MyApplication --config=/etc/app.conf --mode=prod
这对于排查配置问题非常有帮助。
使用 -v 选项
查看 JVM 的启动参数,如堆内存大小(-Xms, -Xmx)、垃圾回收器等。
$ jps -v 5678 MyApplication -Xms512m -Xmx2048m -XX:+UseG1GC
这个选项对于分析内存问题和 JVM 调优至关重要,你可以快速看到哪个进程设置了多大的堆内存。
组合使用选项
你可以组合使用这些选项,-lv:
$ jps -lv 5678 MyApplication -Xms512m -Xmx2048m -XX:+UseG1GC 9012 org.apache.catalina.startup.Bootstrap -Djava.util.logging.config.file=... -Xms512m -Xmx1024m ...
jps 的工作原理
jps 命令的底层原理是依赖于操作系统的临时文件来获取进程信息的。
- 它会扫描一个特定的临时目录,通常是
/tmp/hsperfdata_<username>/。 - 在这个目录下,每个正在运行的 Java 进程都会以其进程 ID 为文件名,创建一个文件。
jps命令读取这些文件,解析其中的信息,从而得到主类名、JVM 参数等。- 这也是为什么
jps只能列出由当前用户(或有权限的用户)启动的 Java 进程的原因。
常见问题与注意事项
-
找不到
jps命令- 原因: Java 的
bin目录没有被添加到PATH环境变量中。 - 解决: 将
$JAVA_HOME/bin添加到~/.bashrc或/etc/profile文件中,source文件使其生效。
- 原因: Java 的
-
jps列出的进程不全,或者看不到某个 Java 进程- 原因:
- 权限问题: 你可能没有权限查看该进程的用户创建的临时文件。
root用户运行jps可能看不到普通用户启动的 Java 进程,反之亦然。 - 进程已结束: 进程可能在你执行
jps的瞬间恰好结束了。 - JVM 问题: JVM 进程可能未能正确创建或更新其性能数据文件。
- 权限问题: 你可能没有权限查看该进程的用户创建的临时文件。
- 解决: 尝试使用
sudo以更高权限运行jps。sudo jps -l
- 原因:
-
jps与ps命令的区别ps aux | grep java: 这是一个更通用的方法,可以列出所有包含 "java" 字符串的进程,它能显示所有用户启动的 Java 进程,但需要你手动解析命令行参数来获取主类名,比较繁琐。jps: 这是一个专门为 Java 设计的工具,能直接、清晰地展示主类名,但受限于用户权限。- 推荐: 在日常排查中,
jps是快速定位 Java 进程的首选,如果需要更全面的信息(如所有用户的进程),可以使用ps命令。
jps 是 Java 开发人员和运维工程师的瑞士军刀之一,它简单、快速、高效,是进行 JVM 问题排查和监控的第一步,熟练掌握 jps 及其常用选项 -q, -l, -m, -v,能极大地提升你的工作效率。
