热获取所有 java 运行 进程 PID 在 java?

Hot to get all java running processes PID in java?

我创建了以下代码来获取所有进程的 PID。但似乎 JRE 不包括 jps 并且我应该在我想使用此代码时安装 JDK 。有谁知道如何获取 java 中所有 运行 java 进程的所有 PIDs 而不是手动而不是我的解决方案?

rt.exec("cmd.exe /k \"C:\Program Files\Java\jdk1.8.0_73\bin\jps.exe\"");
InputStream inputstream = proc.getInputStream();
InputStreamReader inputstreamreader = new InputStreamReader(inputstream);
BufferedReader bufferedreader = new BufferedReader(inputstreamreader);
String line = null;

while (true) {
    if (bufferedreader.ready())
        line = bufferedreader.readLine();
    else
        break;
    if (line == null || line.equals(""))
        break;
    System.out.println(line);
}

如果你想列出一个进程和它的命令行,进程id在Windows,这是命令:

wmic process where "name='java.exe'" get ProcessID, CommandLine

相当于Linux中的“ps -ef | grep java”。

参考: 改编自 Hung Huynh

的博客 post

输出示例:

CommandLine  ProcessId
java  Test   620

jps 的输出示例:

2312 Jps
620 Test

响应更新:

要从 Java 应用程序检索进程 ID 列表,假设您按原样使用 Oracle JDK/Open JDK具体到Sun/Oracle,可以如下做:

// Checking for local Host, one can do for remote machine as well
MonitoredHost local = MonitoredHost.getMonitoredHost("localhost");
// Take all active VM's on Host, LocalHost here
Set<Integer> vmlist = new HashSet<>(local.activeVms());
for (Integer id : vmlist) {
    // 1234 - Specifies the Java Virtual Machine identified by lvmid 1234 
    // on an unnamed host. This string is transformed into the absolute 
    // form //1234, which must be resolved against a HostIdentifier.
    MonitoredVm vm = local.getMonitoredVm(new VmIdentifier(String.format("//%d", id)));
    // take care of class file and jar file both
    String processname = MonitoredVmUtil.mainClass(vm, true);
    System.out.printf("%d: %s%n", id, processname);
}

参考: 改编自 Vaibhav Choudhary

的博客 post

输出示例:

88083: com.intellij.rt.execution.application.AppMain
88082: org.jetbrains.jps.cmdline.Launcher
82789: org.jetbrains.idea.maven.server.RemoteMavenServer
87892: sun.tools.jconsole.JConsole