1. jps 命令介绍
jps
位于 JDK (mac 终端使用命令/usr/libexec/java_home -V
可查看 JDK 安装目录) 的 bin文件夹中,类似于 Linux 的 ps 命令,其作用是显示当前系统的 Java 进程情况。通过 jps 命令可以方便地查看 Java 进程的启动类、传入参数和 Java 虚拟机参数等信息,另外需注意,jps 仅查找
系统当前用户的Java进程,而不是系统中所有Java进程
jps 命令原理
Java 程序启动后会在java.io.tmpdir
指定的目录下生成一个类似于hsperfdata_user
的文件夹,这个文件夹里的文件名称就是 Java 进程的pid。因此列出当前运行的Java进程,就是把该目录里的文件名列一下,解析这些文件就可以获得 Java 程序启动时的 JVM 参数
- 操作系统不同,
java.io.tmpdir
属性指向的临时缓存目录也不一样,mac可在终端中使用命令find / -name "hsperfdata*"
查找。实在不清楚的时候也可以在 main() 方法中添加以下代码,打印出缓存目录。另外 Java 启动时提供了参数-Djava.io.tmpdir
,可以对缓存目录的路径进行设置System.out.println(System.getProperty("java.io.tmpdir"));
2. jps 参数功能
终端中使用命令 man jps
可以查看 jps 的相关文档,其常用参数列表如下
参数 | 功能 |
---|---|
-q | 只显示pid,不显示class名称,jar文件名和传递给 main 方法的参数 |
-m | 输出传递给main 方法的参数,在嵌入式jvm上可能是null |
-l | 输出应用程序 main calss 的完整包名或者应用的 Jar 包的全路径 |
-v | 输出传递给 JVM 的参数 |
- jps -q
- jps -v
想知道应用的日志会输出到哪或者启动的时候使用了哪些 javaagent,就可以使用jps -v
查看进程的 JVM 参数情况
3. jps 注意事项
有时会存在 ps -ef|grep java
能看到启动的 Java 进程,但是jps
查看没有该 pid 的问题。之前也提到过,jps 的数据来源是java.io.tmpdir
属性指向的临时缓存目录中的文件,当这些文件不存在或不能读取时就会出现 jps 看不到该进程号的问题。因此可检查是否是以下原因导致:
-
磁盘读写或目录权限问题
若用户没有权限写缓存目录或是磁盘已满,则无法创建 Java 进程信息文件。而文件已经生成,用户却没有读取权限也会导致问题 -
临时缓存文件被删除
服务器一般都会定时对临时文件夹进行清理,临时缓存目录被清空时 jps 显然无法读取到任何信息 -
缓存目录路径被修改
Java 启动时可使用参数-Djava.io.tmpdir
对缓存文件的路径进行修改,有时这也是为了避免文件存放在缓存目录中被定时清理掉,而 jps 可能无法从修改后的目录读取信息