【问题标题】:Is a jps process a JVM process?jps 进程是 JVM 进程吗?
【发布时间】:2025-11-21 12:40:01
【问题描述】:

在 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

【问题讨论】:

  • 它是一个仪表化的 JVM。 JVM是一个进程。不清楚你在问什么。
  • “仪表化 Java 虚拟机”是什么意思?为什么 jps 进程是 JVM 进程?
  • 检测的 JVM 是当前正在导出 JMX 检测端点的 JVM。 jps 进程是一个检测的 JVM,因为这就是它在您的报价中所说的。
  • 谢谢。 (1) “导出 JMX 检测端点”是什么意思? (2) 能不能启动一个非仪表化的JVM?

标签: java jvm


【解决方案1】:

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

检测的 JVM 是检测的 JVM。

但是,这是一个愚蠢的定义,我一直无法找到明确记录的“仪器化”真正含义的定义。

事实上,它可能(至少)适用于自 Java 5.0 以来的任何 HotSpot JVM。 jps 的当前实现按如下方式查找已检测的 JVM:

  • 如果您指定hostidjps 会尝试联系主机上的 RMI 服务 (jstatd) 以了解 Java 进程。

  • 如果不指定hostidjps 通过查找当前用户可读的/tmp/hsperfdata_<username> 目录来查找Java 进程;见How do jps, jinfo, jstat, jmap and jstack get information about local Java processes?。 JVM 将创建这些目录之一除非您使用-XX:-UsePerfData-XX:-PerfDisableSharedMem 启动JVM。 (感谢@apangin 提供此信息。)

但最终我们仍然有一个循环(工作)定义:“仪表化 JVM”是 jps 能够找到的。


根据定义,jps 进程是 JVM 进程吗?

jps当前 实现是一个 Java 类,它在由通用启动器(jps 可执行文件)创建的 JVM 中运行。但是,没有“定义”表明必须以这种方式实现。

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


jps 是 ELF 文件,不是从 Java 程序编译的 JVM 字节码程序

这实际上与它无关。 JVM 是执行 Java 程序的事物(虚拟机)。它与程序如何启动的“JVM-ness”无关,甚至与程序在启动时是否表示为字节码无关。

使用jlink(或较旧的第 3 方产品),可以将普通的 Java(字节码)程序转换为本机可执行文件。在 Linux 上,jlink 将生成一个 ELF 文件。然而,当你运行 ELF 文件时,你仍然会有一个 JVM。

【讨论】:

    【解决方案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

    【讨论】: