Java process.start сильно тормозит, если родительский элемент не уничтожен после его запуска - PullRequest
3 голосов
/ 07 декабря 2011

Если я запускаю определенный процесс непосредственно из командной строки, я вижу, что он полностью запускается через 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.

Спасибо,

хорошего дня

Ответы [ 2 ]

1 голос
/ 07 декабря 2011

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

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

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

0 голосов
/ 07 декабря 2011

Может быть, вашему дочернему процессу нужен ввод из stdin? Поэтому он зависает до тех пор, пока входные данные не будут предоставлены p.getOutputStream (). Write ()

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

...