5

我需要以编程方式重新创建 jps 工具的功能。我需要找出所有正在运行的 Java 进程及其 ID,以便我可以附加到该进程(类似于 JConsole 所做的)。

我认为 VirtualMachine API 会有所帮助,但是当我运行以下命令时没有得到预期的结果

public class ProcessList {
    public static void main(String[] args){
        List<VirtualMachineDescriptor> vms = VirtualMachine.list();
        for(VirtualMachineDescriptor vm : vms){
            System.out.println (vm.id());
        }
    }
}

当我运行上面的代码时,它只返回一个 ID,但是当我在同一台机器上运行 jps 时,我看到了其他几个进程。

4

3 回答 3

8

jps使用 Oracle/Sun JRE 的内部类MonitoredHost。该activeVMs()方法用于获取主机上所有活动虚拟机的列表。您可以参考sun.tools.jps.JpsOpenJDK 类的源代码,以了解该jps工具是如何工作的。

于 2011-10-10T13:11:37.477 回答
5

这是正确的 API,最终“MonitoredHost#activeVMs()”和“VirtualMachine.list()”通过 jstat 技术使用相同的发现代码。您是否以其他用户身份在命令行上运行 jps?在这种情况下,您会看到不同的 JVM。

请参阅此处JPS是如何实现的。

于 2011-10-10T13:31:39.650 回答
1

您可以执行以下操作:1)创建特定于平台的脚本文件(Windows 为 .bat,Linux 为 .sh 等)2)在这些脚本中使用“wmic process”(Windows)、“ps -ef”(linux)等命令列出进程(通过管道获取 java 进程的结果)。3) 使用 Runtime 的 API 启动上述脚本并获取输出结果

于 2011-10-10T13:15:33.380 回答