Получение 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 ...

Вы можете добавить произвольные свойства в командную строку, если они игнорируются (и не слишком длинные), они безвредны.

Другие вопросы по тегам