"Runtime.getRuntime (). Exec ()" имеет плохую производительность? - PullRequest
4 голосов
/ 12 октября 2010

Я хочу выполнить jar из моего собственного java-приложения.(Невозможно импортировать эту jar-библиотеку и запустить приложение как экземпляр моей собственной "панели запуска").Чтобы выполнить jar из моего собственного java-приложения ... Я использую следующие строки:

String [] cmd = new String [] {"java","-jar","myjar.jar"};
Process process = Runtime.getRuntime().exec(cmd, null, null);

Это прекрасно работает.У меня нет претензий по этому поводу.

Мой вопрос таков: имеет ли это ту же производительность, что и выполнение этого jar с помощью "java -jar myjar.jar" в командной строке?Или это хуже ??Если хуже ... какие-либо предложения о том, могу ли я сделать это с той же производительностью?

Ответы [ 3 ]

3 голосов
/ 12 октября 2010

Производительность практически одинакова, поскольку в обоих случаях происходит одно и то же.Например, на платформе UNIX / Linux:

  • Текущий процесс 'разветвлен'.
  • Новый дочерний процесс 'exec выполняет команду' java ', передавая указанную командную строкуАргументы.
  • Запускается дочерняя JVM ...

Возможны вторичные различия в производительности.Например, способ, которым стандартные дочерние потоки ввода / вывода / ошибки обрабатываются родителем, может отличаться.Но обычно вы можете забыть о подобных вещах.

[Как отмечает @Amadan, использование загрузчика классов для запуска приложения Java в текущей JVM значительно более эффективно ... потому что позволяет избежать накладных расходов JVMзапуск, JIT-компиляция общего кода и т. д. Но главный недостаток (помимо простоты) заключается в том, что у «родительского» приложения нет эффективного способа управления «дочерним» приложением, работающим в той же JVM.Если ребенок застревает в цикле или вообще не справляется с управлением ресурсами, родитель тоже страдает.]

1 голос
/ 12 октября 2010

Конечно, это то же самое.Используйте новый API ProcessBuilder, который имеет лучший способ задания аргументов ..

1 голос
/ 12 октября 2010

Это то же самое.

Выполнение процесса - это выполнение процесса, независимо от того, выполняет ли это процессор команд или ваше приложение.

...