Как получить использование памяти и процессорного времени процесса, выполняемого с использованием ProcessBuilder?

Я выполняю сценарии Python/ Perl на Java, используя processBuilder. Я хочу знать использование памяти и процессорного времени для выполняемого процесса. Java MX Be an ограничен JVM. Следовательно, я не думаю, что это может быть использовано для выполнения скриптов. Пожалуйста помоги.

1 ответ

Решение

Если вы используете Java 9 или новее, используйте Process::info() чтобы получить ProcessHandle.Info объект для процесса (если имеется). В зависимости от того, что JVM поддерживает на вашей платформе ОС, это может дать вам общее время ЦП для процесса и время запуска процессов... которое вы можете использовать для вычисления истекшего времени при некоторых обстоятельствах.


Другая альтернатива в системе Linux - выполнить команду как "/usr/bin/time your command" и проанализировать последние три строки стандартного вывода, чтобы получить истекшее время, "пользовательское" время ЦП и "системное" время ЦП.

Например:

$ time date
Thu Jul  5 20:25:01 AEST 2018

real    0m0.002s
user    0m0.001s
sys     0m0.001s

Захватите и проанализируйте последние 3 строки. (Реализация этого в Java оставлена ​​в качестве упражнения...)

GNU версия time Команда имеет параметры, которые также могут использоваться для отображения использования памяти. Это описано в ручной записи.

Некоторые эквивалентные команды для Windows описаны здесь:


Для записи, это (грубо говоря) это способ использования time используя ProcessBuilder:

   ProcessBuilder pb = new ProcessBuilder(
           "sh", "-c", "/usr/bin/time python filename.py");

или же

   ProcessBuilder pb = new ProcessBuilder(
           "/usr/bin/time python filename.py");

Если вы собираетесь запускать команды в подоболочке, используя "sh -c", входная строка оболочки должна быть одним аргументом команды. поскольку ProcessBuilder не понимает цитирование, это означает, что вы должны выполнить разбиение самостоятельно; смотри выше.

Чтобы получить GNU время для вывода параметров памяти, вам нужно использовать строку формата, как описано в "man time"; например

  /usr/bin/time -f "%e %s %u %M" command to be run

Обратите внимание, что важно использовать "/usr/bin/time" вместо "time", поскольку встроенная команда "time" в некоторых оболочках не понимает опцию "-f".

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