如何获得我的Java进程的id ?

我知道有一些平台相关的黑客,但我更喜欢一个更通用的解决方案。


当前回答

不存在能够保证在所有jvm实现中工作的与平台无关的方法。 ManagementFactory.getRuntimeMXBean(). getname()看起来是最好的(最接近的)解决方案,通常包括PID。它很简短,并且可能适用于广泛使用的每个实现。

在linux+windows上,它返回一个类似“12345@hostname”的值(12345是进程id)。不过要注意的是,根据文档,这个值并没有保证:

返回表示正在运行的Java虚拟机的名称。的 返回的名称字符串可以是任意字符串和Java虚拟 机器实现可以选择嵌入有用的特定平台 返回的名称字符串中的信息。每个运行中的虚拟机 可能有不同的名字。

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

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

其他回答

java.lang.management.ManagementFactory.getRuntimeMXBean().getName().split("@")[0]

你可以在GitHub上查看我的项目:JavaSysMon。它提供了进程id和一堆其他东西(CPU使用率,内存使用率)跨平台(目前是Windows, Mac OSX, Linux和Solaris)

这是我有类似需求时使用的。这将正确地确定Java进程的PID。让您的java代码在预定义的端口号上生成服务器,然后执行操作系统命令找出在端口上侦听的PID。Linux

netstat -tupln | grep portNumber

对于旧的JVM,在linux中…

private static String getPid() throws IOException {
    byte[] bo = new byte[256];
    InputStream is = new FileInputStream("/proc/self/stat");
    is.read(bo);
    for (int i = 0; i < bo.length; i++) {
        if ((bo[i] < '0') || (bo[i] > '9')) {
            return new String(bo, 0, i);
        }
    }
    return "-1";
}
public static long getPID() {
    String processName = java.lang.management.ManagementFactory.getRuntimeMXBean().getName();
    if (processName != null && processName.length() > 0) {
        try {
            return Long.parseLong(processName.split("@")[0]);
        }
        catch (Exception e) {
            return 0;
        }
    }

    return 0;
}