在 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
谢谢。
答案1
“仪器化 Java 虚拟机”是什么意思?
在 Linux 上,“仪表化 Java 虚拟机”是使用该-XX:+UsePerfData
选项启动的虚拟机——默认情况下该选项处于启用状态。
这会将性能和其他信息存储到/tmp/hsperfdata_$USER/$PID
文件中,该工具将读取该jps(1)
文件。
如果您想启动未检测的 JVM,请将其作为java -XX:-UsePerfData YourClass
.这将阻止它写入 hsperfdata 并出现在jps
的输出中。
根据定义,jps 进程是 JVM 进程吗?
是的
jps 是一个 ELF 文件,而不是由 Java 程序编译而成的 JVM 字节码程序:
jps
只是一个发射器,这将启动 JVM 并加载sun.tools.jps.Jps
java类就从tools.jar
里面进去了。以这种方式启动的 JVM 将编写自己的 hsperfdata 文件,这就是该类Jps
出现在其自己的输出中的原因。您可以通过将与上面相同的选项传递给 JVM 来关闭它-J
转变:
$ jps
12583 Jps
$ jps -J-XX:-UsePerfData
$
答案2
是的,jps
是一个Java应用程序。
那就是
jps
命令就派上用场了。它将列出为您正在使用的 JDK 安装目录启动的所有虚拟机的进程 ID。您的输出,特别是进程 ID,可能会有所不同:
> jps 5156 Jps 4276 MyFrame
自从
jps
命令本身是一个Java程序,它也显示在列表中。