菜鸟科技网

Linux的jps命令有哪些具体用途?

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

Linux的jps命令有哪些具体用途?-图1
(图片来源网络,侵删)

jps 命令简介

jps 命令非常轻量级,它不提供像 jstatjstack 那样详细的 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 的选项不多,但非常实用。

Linux的jps命令有哪些具体用途?-图2
(图片来源网络,侵删)
选项 全称 描述
-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,而不关心类名。

Linux的jps命令有哪些具体用途?-图3
(图片来源网络,侵删)
$ 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 命令的底层原理是依赖于操作系统的临时文件来获取进程信息的。

  1. 它会扫描一个特定的临时目录,通常是 /tmp/hsperfdata_<username>/
  2. 在这个目录下,每个正在运行的 Java 进程都会以其进程 ID 为文件名,创建一个文件。
  3. jps 命令读取这些文件,解析其中的信息,从而得到主类名、JVM 参数等。
  4. 这也是为什么 jps 只能列出由当前用户(或有权限的用户)启动的 Java 进程的原因。

常见问题与注意事项

  1. 找不到 jps 命令

    • 原因: Java 的 bin 目录没有被添加到 PATH 环境变量中。
    • 解决: 将 $JAVA_HOME/bin 添加到 ~/.bashrc/etc/profile 文件中,source 文件使其生效。
  2. jps 列出的进程不全,或者看不到某个 Java 进程

    • 原因:
      • 权限问题: 你可能没有权限查看该进程的用户创建的临时文件。root 用户运行 jps 可能看不到普通用户启动的 Java 进程,反之亦然。
      • 进程已结束: 进程可能在你执行 jps 的瞬间恰好结束了。
      • JVM 问题: JVM 进程可能未能正确创建或更新其性能数据文件。
    • 解决: 尝试使用 sudo 以更高权限运行 jpssudo jps -l
  3. jpsps 命令的区别

    • ps aux | grep java: 这是一个更通用的方法,可以列出所有包含 "java" 字符串的进程,它能显示所有用户启动的 Java 进程,但需要你手动解析命令行参数来获取主类名,比较繁琐。
    • jps: 这是一个专门为 Java 设计的工具,能直接、清晰地展示主类名,但受限于用户权限。
    • 推荐: 在日常排查中,jps 是快速定位 Java 进程的首选,如果需要更全面的信息(如所有用户的进程),可以使用 ps 命令。

jps 是 Java 开发人员和运维工程师的瑞士军刀之一,它简单、快速、高效,是进行 JVM 问题排查和监控的第一步,熟练掌握 jps 及其常用选项 -q, -l, -m, -v,能极大地提升你的工作效率。

分享:
扫描分享到社交APP
上一篇
下一篇