jps进程是JVM进程吗?

时间:2019-04-14 01:05:13

标签: java jvm

在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

谢谢。

2 个答案:

答案 0 :(得分:4)

  

“仪器化的Java虚拟机”是什么意思?

已检测的JVM是已检测的JVM。

但是,这是一个错误的定义,我还没有找到真正含义的清晰解释。

实际上,这可能(至少)适用于Java 5.0以后的任何HotSpot JVM。 jps的当前实现寻找经过检测的JVM,如下所示:

  • 如果您指定hostid,则jps尝试与主机上的RMI服务(jstatd)联系以了解有关Java进程的信息。

    < / li>
  • 如果您未指定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 current 实现是一个Java类,它在由通用启动器(jps可执行文件)创建的JVM中运行。但是,没有“定义”表示必须以这种方式实现。

请注意,由于jps不带任何参数,因此会发现自己(至少在我的系统上如此),这表明当前的实现使用了 instrumented JVM。

答案 1 :(得分:2)

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