Получение RAM/CPU использования определенного процесса в Java
Я пытаюсь собрать данные об использовании ОЗУ и ЦП процесса в Windows. Более конкретно, мне нужно различать два процесса по отдельности (которые могут иметь одинаковое имя) или получать информацию о процессе напрямую.
Например, мне может потребоваться собрать данные из процесса 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 ответ
Я хотел бы использовать jps
чтобы получить подробную информацию о каждом процессе Java.
например
$ 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
чтобы получить больше информации об этих процессах по идентификатору.
Если командные строки одинаковы, я предлагаю добавить фиктивное свойство, чтобы было легче их различать, например
java -Dprocess=MyFirstProcess ... your normal command line args ...
Вы можете добавить произвольные свойства в командную строку, если они игнорируются (и не слишком длинные), они безвредны.