我正在尝试收集流程的数据' 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
时,我如何知道哪一个?)
答案 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
因为它可以看到自己而另一个正在运行插口。
此信息可与tasklist
或ps
一起使用,以通过ID获取有关这些流程的更多信息。
如果命令行相同,我建议添加一个虚拟属性,以便更容易区分它们,例如。
java -Dprocess=MyFirstProcess ... your normal command line args ...
您可以向命令行添加任意属性,只要它们被忽略(并且不会太长),它们是无害的。