Используемая память и время, занятое внешним процессом, вызванным с помощью ProcessBuilder в Java

1

Я искал 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;
                    }

              }

Но этот метод расчета времени медленный. Есть ли более быстрый способ сделать то же самое. Кроме того, я не могу получить память, используемую процессом. Как я могу его получить?

Кроме того, этот код используется несколькими потоками, что означает, что несколько процессов одновременно вызывают разные потоки.

  • 0
    Java не обеспечивает аудит процессов. Это в лучшем случае делается ОС. unix.stackexchange.com/questions/23275/… может дать некоторые идеи.
  • 0
    Метод расчета времени не выглядит особенно медленным. Однако проверка превышения лимита времени будет выполняться только после завершения процесса, так как этот поток ожидает в process.exitValue() .
Показать ещё 5 комментариев
Теги:
multithreading
processbuilder

1 ответ

1

Одним из решений было бы запустить скрипт-оболочку вместо запуска команды напрямую. Цель скрипта - проверить время выполнения и использование памяти (с помощью служебных программ ОС) и вернуть код ошибки, чтобы указать на какие-либо проблемы.

В качестве альтернативы вы можете использовать JNI или другие команды, специфичные для ОС, для определения использования памяти другим процессом.

Если другой процесс представляет собой JVM или какую-либо другую программу, которая сообщит об использовании памяти (например, через MXBean), тогда ваш цикл может запросить прямое сообщение об использовании памяти.

  • 1
    Можете ли вы дать мне больше объяснений или дать несколько хороших ссылок, откуда я могу изучать эти вещи, также Thread.sleep (...) хорошо, когда я не хочу вычислять время, в течение которого выполнялся процесс, но это не поможет мне рассчитать точное время. Это просто даст мне знать, если процесс все еще запущен или закончил время ожидания.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню