Java的jps工具在内部使用哪个API?

vla*_*ien 4 java jmx java-api jdk-tools

我需要以编程方式重新创建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());
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

Vin*_*lds 7

jps使用内部类 - MonitoredHostOracle/Sun JRE.该activeVMs()方法用于获取主机上所有活动VM的列表.您可以参考sun.tools.jps.JpsOpenJDK类的来源,了解该jps工具如何工作.


Ing*_*gel 5

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

在这里查看JPS是如何实现的。