Java 代码 - 在本地主机 JVM 中列出 java 进程的最佳方式(对于 Linux & Windows]

Java code - Best way to list java processes in localhost JVM (for Linux & Windows]

我正在编写一个控制台应用程序,它将 运行 在 Linux 和 Windows 系统中。此应用主要 运行 JRE 1.8 环境。

在我的代码中,它需要获取 运行 在我的应用程序主机 运行 上的 Java 个进程的列表。我已经阅读了关于 jps 的帖子,它是 JDK 的一部分,但不是 JRE,而且它是一个单独的可执行文件。

我的问题是,有没有我可以使用的 java 库来列出(最好也杀死一些)运行ning Java 进程?最好,我不想像 Runtime.exec().

这样麻烦地调用 jps 可执行文件

在此先感谢您提出任何建议。

糟糕:我刚刚发现您需要 JRE1.8 的解决方案,这仅对 JRE9+ 有帮助。

在 JRE 中扫描进程的一种简单方法是使用 ProcessHandle.allProcesses()。这将读取所有进程,您可以在使用“java”或“java.exe”的简单名称匹配上添加过滤器:

Path java = Path.of("bin", "java.exe");  // use "java" if not on Windows

ProcessHandle.allProcesses()
             .filter(ph -> ph.info().command().isPresent())
             .filter(ph -> Path.of(ph.info().command().get()).endsWith(java))
             .forEach(ph -> {
                 System.out.println("PID "+ph.pid()+" "+ph.info().command());
})

这种方法不会发现 Java 嵌入在 EXE 中的 VM - 例如来自 jpackage - 因此不如使用 JDK jps 那样可靠,它确实识别jpackage 个 EXE 和 JDK 个工具,例如 jshell.exe

我终于找到了名为 Oshi 的第 3 方库,它显然不需要 JDK 并且与 Java 1.8 兼容:https://github.com/oshi/oshi

为了将来参考,这里有一个示例方法:

public static List<OSProcess> getOSProcesses() {
    SystemInfo si = new SystemInfo();
    OperatingSystem os = si.getOperatingSystem();
    return os.getProcesses();
}