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

时间:2014-08-01 11:40:13

标签: java linux jvm

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

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

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

我能想到两种方式

  1. 连接到有问题的JVM,然后告诉它
  2. 来自/proc文件系统
  3. 关于第一种选择,是否使用本地JMX连接?不过,它必须转到/proc才能获得pids。

    1. 有PID,所以它必须要求OS
    2. jps列出了自己
    3. 关于第二种选择,我觉得这可能是正确的,因为

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

        但是,我在这里面临的问题很少。当java命令很长时(例如,参数非常长-classpath),有关命令行的信息不适合/proc中为其保留的空间。我的系统有4kB,而我在其他地方学到的,这是在OS代码中硬连线(改变它需要内核编译)。但是,即使在这种情况下,jps仍然可以在某处获得该主类。怎么样?

        我需要找到更快的方法来获取JVM进程而不是调用jps。当系统负载很严重时(例如当JVM启动时),jps卡住几秒钟(我已经看到它等待了大约30秒)。

1 个答案:

答案 0 :(得分:3)

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

要了解PerfData文件的格式,您必须查看JDK source code