jps命令的作用
jps命令是JDK中自带的命令,位于bin目录下,其作用是显示当前用户下系统中所有的Java进程的相关信息,比如pid。有了这个命令,可以很方便的显示Java进程,不过显示的是当前用户的所有Java进程,不能根据项目名称查找,如果需要查找某个特定的Java程序,可以使用ps -ef | grep JavaName。
jps的实现原理
jsp的实现原理很简单,主要是程序在启动的时候,会在java.io.tmpdir指定的临时目录下,生成一个类似hsperfdata_User的文件夹,里面的文件名称就是以程序的pid命名的,所以显示进程,只需要把文件名列出即可,其他的参数,可以根据文件内容解析获得。
每中系统的java.io.tmpdir可能不一样,可以通过如下代码找到指定的临时文件目录:1
System.getProperty("java.io.tmpdir")
在获取到这个目录之后,打开该目录,在下面寻找hsperfdata_User文件夹,进入即可看到所有的程序进程文件,比如:1
2
3
4drwxr-xr-x 4 user staff 136 1 29 20:22 ./
drwx------@ 52 user staff 1768 1 29 20:21 ../
-rw------- 1 user staff 32768 1 29 20:06 447
-rw------- 1 user staff 32768 1 29 20:22 544
可以看到,这下面有两个文件,名称分别是447、544,我们可以使用jsp命令验证是否是上面说的实现:1
2
3
4user-4:~ user$ jps
544 Launcher
585 Jps
447
可以看到这里有三个java进程,注意一下,多的那一个是jps自己的进程,其他的两个是系统中启动的。
jps命令使用
为了方面演示,首先写一个程序,并一直运行,代码如下:1
2
3
4
5
6
7
8
9
10public class JpsDemo {
public static void main(String[] agrs) {
try {
TimeUnit.SECONDS.sleep(60 * 60);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
先看一下直接使用jps显示的内容,这里只展示演示的进程(后面也只展示相关的进程):1
2user-4:~ user$ jps
625 JpsDemo
首先,如果不知道jps有什么命令,以及格式,可以通过jps -help查看:1
2
3
4
5
6user-4:~ user$ jps -help
usage: jps [-help]
jps [-q] [-mlvV] [<hostid>]
Definitions:
<hostid>: <hostname>[:<port>]
-q:显示pid,不显示class名称以及传递给main方法的参数:
1
2user-4:~ user$ jps -q
625-m:显示传递给main方法的参数:
1
2user-4:~ user$ jps -m
625 JpsDemo test test1-l:显示启动类完整的包名或者应用程序jar包完整的路径名:
1
2user-4:~ user$ jps -l
625 com.xiaohu.test.JpsDemo-V:显示传递给JVM的参数:
1
2user-4:~ user$ jps -l
644 JpsDemo -agentlib:jdwp=transport=dt_socket,address=127.0.0.1:50171,suspend=y,server=n -Dfile.encoding=UTF-8
总结
Java自带的jps命令方便查看该用户下所有的Java进程,特别是有的Java进程,我们不知道名称,比如idea,eclipse等等,-v和-m等参数可以让我们快速的知道启动时传递给虚拟机以及程序的参数。但是,jps不能根据某个应用名称查看,而是把所有的都显示出来,对于运行大量的Java程序的系统,这个命令就不那么让人感觉到爽了。