Java process.start сильно тормозит, если родитель не уничтожается после его запуска

Если я запускаю конкретный процесс прямо из командной строки, я вижу, что он полностью запускается через 2-3 секунды.

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

С ProcessBuilder:

ProcessBuilder pb = new ProcessBuilder(cmd);
pb.directory(new File(dir));
Process p = pb.start();

С Runtime.exec:

Runtime.getRuntime().exec(cmd, null, new File(dir));

В любом случае, если я не установлю для нового объекта Process значение null и сразу же вызову сборщик мусора, новому процессу потребуется до 3 минут, чтобы сделать то же самое, что он должен сделать за 3 секунды.

Process p = pb.start();
p = null;
Runtime.getRuntime().gc();

Использование приведенного выше кода устраняет проблему. Может кто-нибудь объяснить мне, почему? Я думаю, что это связано с обработкой процессов JVM, но это всего лишь предположение.

Новый процесс использует Hibernate для подключения к базе данных MySQL, записывает файлы журналов с помощью log4j, читает из файла .properties и подключается к серверу RabbitMQ.

Спасибо,

хорошего дня


person grog    schedule 07.12.2011    source источник


Ответы (2)


Запуск внешних программ из Java-приложений, как известно, непрост для правильного выполнения.

Я рекомендую использовать высококачественную библиотеку Apache Commons Exec.

Если вы хотите избежать добавления зависимости в свой код, хотя бы посмотрите на Java-код библиотеки Exec, чтобы увидеть, как он создает и запускает процессы.

person Chad Nouis    schedule 07.12.2011
comment
Спасибо, но я не ищу альтернативу, мне просто интересно, почему это происходит. - person grog; 08.12.2011

Может быть, вашему дочернему процессу нужен ввод со стандартного ввода? Таким образом, он зависает до тех пор, пока ввод не будет предоставлен функцией p.getOutputStream().write().

Или он может подождать, пока его стандартный вывод не будет использован.

person korifey    schedule 07.12.2011
comment
Нет, я запускаю программу как java -jar ‹program›.jar file.properties. Ввод никогда не запрашивается - person grog; 08.12.2011