Java程序如何获得自己的进程ID?

时间:2020-03-05 18:45:24  来源:igfitidea点击:

如何获取Java进程的ID?

我知道有几种与平台有关的黑客,但是我希望有一个更通用的解决方案。

解决方案

回答

没有可以保证在所有jvm实现中都可以使用的与平台无关的方式。
ManagementFactory.getRuntimeMXBean()。getName()看起来是最好的(最近的)解决方案。它很短,可能在广泛使用的每个实现中都有效。

在linux + windows上,它返回一个类似于12345 @ hostname的值(12345是进程ID)。但是请注意,根据文档,并不能保证该值:

Returns the name representing the running Java virtual machine. The
  returned name string can be any arbitrary string and a Java virtual
  machine implementation can choose to embed platform-specific useful
  information in the returned name string. Each running virtual machine
  could have a different name.

在Java 9中,可以使用新的流程API:

long pid = ProcessHandle.current().pid();

回答

这取决于我们从哪里寻找信息。

如果要从控制台中查找信息,则可以使用jps命令。该命令给出的输出类似于Unix ps命令,并且随JDK一起提供,因为我相信1.5

如果我们从流程中查找,则RuntimeMXBean(如Wouter Coekaerts所说)可能是最佳选择。 Windows上使用Sun JDK 1.6 u7的getName()的输出格式为[PROCESS_ID] @ [MACHINE_NAME]。但是,我们可以尝试执行jps并从中解析结果:

String jps = [JDK HOME] + "\bin\jps.exe";
Process p = Runtime.getRuntime().exec(jps);

如果不带选项运行,则输出应为进程ID,后跟名称。

回答

我们可以签出我的项目:GitHub上的JavaSysMon。它提供了进程ID和跨平台(目前为Windows,Mac OSX,Linux和Solaris)的其他功能(CPU使用率,内存使用率)

回答

尝试Sigar。非常广泛的API。 Apache 2许可证。

private Sigar sigar;

    public synchronized Sigar getSigar() {
        if (sigar == null) {
            sigar = new Sigar();
        }
        return sigar;
    }

    public synchronized void forceRelease() {
        if (sigar != null) {
            sigar.close();
            sigar = null;
        }
    }

    public long getPid() {
        return getSigar().getPid();
    }