Как получить использование памяти и процессорного времени процесса, выполняемого с использованием 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".