在Ubuntu上,man jps
说
jps - 列出目标系统上的已检测Java虚拟机(JVM)。
“仪表化Java虚拟机”是什么意思?
$ jps -v
29584 Jps -Dapplication.home=/usr/lib/jvm/java-11-openjdk-amd64 -Xms8m -Djdk.module.main=jdk.jcmd
根据定义,jps进程是JVM进程吗?
jps是一个ELF文件,而不是从Java程序编译的JVM字节码程序:
$ file /usr/lib/jvm/java-11-openjdk-amd64/bin/jps
/usr/lib/jvm/java-11-openjdk-amd64/bin/jps: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/l, for GNU/Linux 3.2.0, BuildID[sha1]=3f48c70ab711b493ee793c92c19b3a884896bb4d, stripped
$ jps -v
16462 Jps -Dapplication.home=/usr/lib/jvm/java-11-openjdk-amd64 -Xms8m -Djdk.module.main=jdk.jcmd
谢谢。
“仪表化Java虚拟机”是什么意思?
已检测的JVM是一个已检测的JVM。
然而,这是一个愚蠢的定义,我无法找到真正含义的明确解释。
实际上,这可能适用于(至少)自Java 5.0以来的任何HotSpot JVM。 jps
的当前实现查找已检测的JVM,如下所示:
hostid
,jps
会尝试联系主机上的RMI服务(jstatd
)以了解Java进程。hostid
,jps
通过查找当前用户可读的/tmp/hsperfdata_<username>
目录来查找Java进程;见How do jps, jinfo, jstat, jmap and jstack get information about local java processes?。除非您使用-XX:-UsePerfData
或-XX:-PerfDisableSharedMem
启动JVM,否则JVM将创建其中一个目录。 (感谢@apangin获取此信息。)根据定义,jps进程是JVM进程吗?
jps
的当前实现是一个Java类,它在由通用启动程序(jps
可执行文件)创建的JVM中运行。但是,没有“定义”表明必须以这种方式实施。
请注意,因为没有任何参数的jps
会发现自己(至少在我的系统上),这意味着当前的实现使用了一个检测的JVM。
JVM附带的大多数命令实际上都是使用Java实现的。在这种情况下,jps
启动JVM来运行类sun.tools.jps.Jps
http://www.docjar.com/html/api/sun/tools/jps/Jps.java.html
同样javac
实际上运行com.sun.tools.javac.Main
https://docs.oracle.com/javase/9/docs/api/com/sun/tools/javac/Main.html