获取Java中特定进程的RAM / CPU使用率

时间:2016-03-30 22:19:14

标签: java process tasklist

我正在尝试收集流程的数据' Windows中的RAM和CPU使用率。更具体地说,我需要区分两个进程(可以使用相同的名称)或直接获取进程的信息。

例如,我可能需要从流程X收集数据,这些数据可能与流程Y具有相同的名称。我正在使用tasklist.exe

String line;
Process process = Runtime.getRuntime().exec("tasklist.exe");
BufferedReader input = new BufferedReader(new InputStreamReader(process.getInputStream()));
while ((line = input.readLine()) != null) {
    if (line.startsWith("java.exe")) // I only want the processes that have 'java.exe' for a name.
        System.out.println(line);
}

运行它会给我两个不同的进程,名称相同:

java.exe                     28912 Console                    9     18,664 K
java.exe                     36388 Console                    9     19,896 K

在这种情况下,我只想从第二个过程中收集信息。我认为我可以使用PID作为标识符,但似乎每次运行此程序都会更改上面显示的过程的PID

问题:如何多次从同一进程收集数据,即使它具有相同名称的对应数据? (当我再次运行tasklist时,我如何知道哪一个?)

1 个答案:

答案 0 :(得分:1)

我会使用jps来获取每个Java进程的详细信息。

e.g。

$ jps -lvm
22490 sun.tools.jps.Jps -lvm -Dapplication.home=/mnt/opt/jdk1.8.0_66 -Xms8m
6495 spigot-1.9.jar

一个Java进程是jps因为它可以看到自己而另一个正在运行插口。

此信息可与tasklistps一起使用,以通过ID获取有关这些流程的更多信息。

如果命令行相同,我建议添加一个虚拟属性,以便更容易区分它们,例如。

java -Dprocess=MyFirstProcess ... your normal command line args ...

您可以向命令行添加任意属性,只要它们被忽略(并且不会太长),它们是无害的。