Я искал stackoverflow для этого вопроса, но у меня не было никакого полезного ответа. Я хочу получить используемую память и время, затраченное внешним процессом, который вызывается ProcessBuilder в Java. Если процесс превышает ограничение по времени/ограничение памяти, мне нужно его убить.
Чтобы вычислить время, затраченное на процесс, я использую следующий код:
process = new ProcessBuilder(command).start();
starttTime = System.currentTimeMillis();
flag=false;
while (flag != true) {
try {
returnValue = process.exitValue();
flag = true;
if (returnValue != 0) {
System.out.println("Abnormal termination");
} else {
System.out.println("Normal termination");
}
System.out.println("Done");
} catch (IllegalThreadStateException e) {
}
currentTime = System.currentTimeMillis();
if (currentTime - startTime > timeLimitInMilli) {
System.out.println("process exceeding time limit");
break;
}
}
Но этот метод расчета времени медленный. Есть ли более быстрый способ сделать то же самое. Кроме того, я не могу получить память, используемую процессом. Как я могу его получить?
Кроме того, этот код используется несколькими потоками, что означает, что несколько процессов одновременно вызывают разные потоки.
Одним из решений было бы запустить скрипт-оболочку вместо запуска команды напрямую. Цель скрипта - проверить время выполнения и использование памяти (с помощью служебных программ ОС) и вернуть код ошибки, чтобы указать на какие-либо проблемы.
В качестве альтернативы вы можете использовать JNI или другие команды, специфичные для ОС, для определения использования памяти другим процессом.
Если другой процесс представляет собой JVM или какую-либо другую программу, которая сообщит об использовании памяти (например, через MXBean), тогда ваш цикл может запросить прямое сообщение об использовании памяти.
process.exitValue()
.