有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

Java代码列出localhost JVM中Java进程的最佳方式(适用于Linux和Windows)

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

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

我的问题是,是否有任何java库可以用来列出(理想情况下也可以杀死一些)正在运行的java进程?最好,我不想麻烦地用运行时之类的东西调用jps可执行文件。exec()

提前感谢您的建议


共 (2) 个答案

  1. # 1 楼答案

    我刚刚发现你需要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());
    })
    

    这种方法不会发现嵌入在EXE中的Java虚拟机,比如来自jpackage,因此不如使用JDKjps可靠,后者可以识别jpackageEXE和jshell.exe等JDK工具

  2. # 2 楼答案

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

    以下是一个示例方法,供将来参考:

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