我想知道,jps工具如何获得它在jvm进程中执行的主类的名称。它是
jps -l
123 package.MainClass
456 /path/example.jar
我特别谈到Linux(我对Windows不感兴趣,也没有Win机器可供实验)。
我可以想出两种方法
连接到有问题的jvm,而jvm反过来告诉它
从
/proc
文件系统关于第一个备选方案,它是否使用本地jmx连接?不过,PIDS必须转到
/proc
。有PID,所以它必须询问OS
jps
列表本身关于第二种选择,我觉得这可能是正确的,因为
在命令行中,有
-jar
或MainClass
很清楚PID
在开始做某事之前,它在
/proc
中有自己的文件夹但是,我在这里面临一个小问题。当java命令很长时(例如有非常长的
jps
参数),关于命令行的信息不适合在/proc
中为其保留的空间。我的系统有4KB,我在别处学到的是,这是硬连接在操作系统代码中的(更改它需要内核编译)。然而,即使在这种情况下-classpath
仍然能够在某个地方获得主类。怎么用?我需要找到比调用
/proc
更快的方法来获取jvm进程。当系统负载很重时(例如,当jvm的数量开始时),jps
被卡住了几秒钟(我看到它等待了大约30秒)。 最佳答案
jps
扫描包含正在运行的jvm的监视器和计数器的文件。名为/tmp/hsperfdata_<username>/<pid>
的监视器包含您要查找的字符串。
要了解perfdata文件的格式,您必须查看JDK source code。
关于java - JPS工具如何获取正在执行的主类或jar的名称,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25079439/