java - JPS工具如何获取正在执行的主类或jar的名称

标签 java linux jvm

我想知道,JPS 工具如何获取它在 jvm 进程中执行的主类的名称。这是

jps -l
123   package.MainClass
456   /path/example.jar

我在专门谈论 Linux(我对 Windows 不感兴趣,而且我没有 Win 机器可以试验)。

我可以想到两种方法

  1. 连接到有问题的 JVM,后者又告诉它
  2. 来自/proc 文件系统

关于第一种选择,它是否使用本地 JMX 连接?不过,它必须转到 /proc 以获得 pids。

  1. 有PID,所以无论如何都要问OS
  2. jps 也列出了它自己

关于第二种选择,我觉得这可能是正确的,因为

  1. 在命令行上,有-jarMainClass
  2. /proc 非常了解 PID
  3. jps 开始做某事之前,它在 /proc 中有自己的文件夹>

但是,我在这里遇到的问题不大。当java命令很长时(比如-classpath参数特别长),命令行的信息放不下/proc中为它预留的空间。我的系统有 4kB 的空间,而我在别处学到的是,这是硬连线在操作系统代码中的(更改它需要内核编译)。然而,即使在这种情况下,jps 仍然能够在某处获取该主类。怎么办?

我需要找到比调用 jps 更快的方法来获取 JVM 进程。当系统完全加载时(例如,当 JVM 数量开始时),jps 卡住了几秒钟(我看到它等待 ~30s)。

最佳答案

jps扫描/tmp/hsperfdata_<username>/<pid>包含正在运行的 JVM 的监视器和计数器的文件。名为 sun.rt.javaCommand 的监视器包含您要查找的字符串。

要找出 PerfData 文件的格式,您必须查看 JDK source code .

关于java - JPS工具如何获取正在执行的主类或jar的名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25079439/

相关文章:

linux - 机器重启后openssl报错解密失败或坏记录mac

java - 使用 JMX 获取远程 JVM 属性

jvm - win10如何通过netbeans8.2调试openjdk9?

c# - 我可以在 CentOS 上安装适用于 Linux 的 .NET Core 和 Npgsql 吗?

java - 无法执行目标 org.apache.maven.plugins :maven-archetype-plugin:3. 1.2:generate

java - 如何对可嵌入实体属性实现验证约束?

java - 检测密码加密类型——我可以将它们导入 Django 吗?

linux - 如何在linux中绘制二维图

c - 拦截linux pthread_create函数,导致JVM/SSH崩溃

java - 关闭应用程序后服务未运行