jps全称为Java Virtual Machine Process Status Tool,是Java提供的一个查看当前用户有权访问的主机的Java进程情况的工具。
因为每一个Java程序都会独占一个Java虚拟机实例,所以,可以通过jps来查看服务器上究竟启动了几个java进程。
jps命令在jdk的JAVA_HOME/bin/目录下面。
语法
jps [ options ] [ hostid ]
options是命令行参数,hostid指特定主机,可以是ip地址、域名,也可以指定具体协议和端口。
options参数说明
1)-q 只输出PID。
2)-m 输出传递给 main 方法的参数。对于嵌入式 JVM,输出可能为空。
3)-l 输出应用程序主类的完整包名或应用程序 JAR 文件的完整路径名。
4)-v 输出传递给 JVM 的参数。
5)-V 通过 flags 文件(.hotspotrc 文件或 -XX:Flags=< filename > 参数指定的文件)输出传递给 JVM 的参数。本参数不常用。
6)-Joption 将选项传递给jps调用的java启动器。例如,-J-Xms48m是将启动内存设置为 48 兆字节。
输出格式
lvmid [ [ classname | JARfilename | "Unknown"] [ arg* ] [ jvmarg* ] ]
原理
java程序在启动以后,会在java.io.tmpdir指定的目录下,就是临时文件夹里,生成一个类似于hsperfdata_User的文件夹,这个文件夹里(在Linux中为/tmp/hsperfdata_{userName}/;在我的windows中为D:\Dev\JetBrains\system\compile-server\user_8c68fcc2\_temp_\目录下),有几个名字为java进程的pid的文件。因此,列出当前运行的java进程,只是把这个目录里的文件名列一下而已。 至于系统的参数什么,解析这几个文件就可以获得。
Linux下目录为/tmp/hsperfdata_{userName}/
注意点
如果需要在当前服务器上查看其他机器上的Jvm进程,则需要在待查看机器上启动jstatd。
举例
jps 不带option的时候,默认列出JVM标示符号(PID)和简单的主类名或jar名称
jps -q 只输出JVM进程的PID
jps -m 输出传递给 main 方法的参数
jps -l 输出应用程序主类的完整包名
jps -v 输出传递给 JVM 的参数
jps -J-Xms48m
JPS失效
JPS失效的原因是什么?
现象:可能在服务器上会出现用“ps -ef | grep java”可以看到启动的java进程,用jps却查看不到该进程的pid。
分析:jps、jconsole、jvisualvm等工具的数据来源就是上面说到的java.io.tmpdir参数指定的目录下的文件(如,/tmp/hsperfdata_userName/pid)。当该文件不存在,或者无法读取时就会出现jps无法查看该进程号,jconsole无法监控等问题。
具体原因可能是:
1)磁盘读写、目录权限问题。若该用户没有权限写/tmp目录或是磁盘已满,则无法创建/tmp/hsperfdata_userName/pid文件。或该文件已经生成,但用户没有读权限。
2)临时文件丢失,被删除或是定期清理。对于linux机器,一般都会存在定时任务对临时文件夹进行清理,导致/tmp目录被清空。常用的可能定时删除临时目录的工具为crontab、redhat的tmpwatch、ubuntu的tmpreaper等等
3)java进程信息文件存储地址被设置为不在/tmp目录下。 通过-Djava.io.tmpdir设置的目录不是/tmp,而jps、jconsole都只会从/tmp目录读取,而无法从设置后的目录读物信息。
转自:jps命令详解 - 知乎