我想知道,JPS 工具如何获取它在 jvm 进程中执行的主类的名称。这是
jps -l
123 package.MainClass
456 /path/example.jar
我在专门谈论 Linux(我对 Windows 不感兴趣,而且我没有 Win 机器可以试验)。
我可以想到两种方法
- 连接到有问题的 JVM,后者又告诉它
- 来自
/proc
文件系统
关于第一种选择,它是否使用本地 JMX 连接?不过,它必须转到 /proc
以获得 pids。
- 有PID,所以无论如何都要问OS
jps
也列出了它自己
关于第二种选择,我觉得这可能是正确的,因为
- 在命令行上,有
-jar
或MainClass
/proc
非常了解 PID- 在
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/