Возможно ли, чтобы JVM запускала более одной программы одновременно? Если да, то как? Если нет, то почему?
Чтобы запустить программу, мы просто делаем
java ProgramName
Но можно ли использовать тот же экземпляр JVM для запуска другой программы?
Возможно ли, чтобы JVM запускала более одной программы одновременно? Если да, то как? Если нет, то почему?
Чтобы запустить программу, мы просто делаем
java ProgramName
Но можно ли использовать тот же экземпляр JVM для запуска другой программы?
Ответ зависит от вашего определения "программа". Программы Java, которые имеют метод main
и что вы начинаете с java NameOfClass
, как правило, не могут быть запущены в одной JVM, потому что нет встроенного разделения ресурсов или пространств имен. Например, что делать, если две программы используют конфликтующие версии одной и той же библиотеки?
У нас также есть приложения, которые предназначены для совместного использования JVM, таких как корпоративные приложения. Это программы, которые предназначены для работы в контексте "сервера приложений", который в основном представляет собой программу для запуска других программ. Сервер приложений хранит ресурсы приложений отдельно, используя загрузчиков классов и менеджеров безопасности. Например, два приложения могут использовать конфликтующие версии библиотеки или конфликтующие имена классов и до сих пор используют JVM благодаря загрузке через разные загрузчики классов.
Не напрямую. Однако, поскольку JVM поддерживает потоки, вы можете вставлять обе программы вместе, создавая оболочку, которая запускает каждую из них в другом потоке (при условии, что они совместимы и не выполняют такие вещи, как определение разных классов с тем же именем).
Если вы не хотите, чтобы программы могли вообще вмешиваться друг в друга или делиться каким-либо состоянием, то какой смысл даже запускать их в одном процессе? Если все, что вы хотите сделать, это сохранить память, загрузив стандартную библиотеку один раз, вы можете настроить SecurityManagers
и ClassLoaders
, чтобы изолировать две программы. Однако это обязательно мешает им совершать безумные вещи с отражением.
Если вы выполняете команду JAVA из командной строки, она всегда будет запускаться на отдельном экземпляре JVM. Вы можете использовать отдельные потоки для программ, если хотите использовать одну и ту же JVM. Но с помощью команды JAVA это будут два отдельных процесса, следовательно, отдельный JVM.
С одной стороны, вы не можете. JVM запускает только одну программу. С другой стороны, стартовая программа может просто запускать другие программы последовательно или параллельно. Последовательный способ особенно прост:
ClassName1.main(new String[]{arg1, arg2});
ClassName2.main(new String[]{arg1, arg2, arg3});
IBM разрабатывает JVM "multi-tenant" http://www.ibm.com/developerworks/library/j-multitenant-java/, который позволит/проще запускать несколько программ Java внутри одного и того же виртуальная машина.
Чтобы выполнить команду java
, вам нужно использовать
java [ options ] class [ argument ... ]
java [ options ] -jar file.jar [ argument ... ]
Также из java
- запуск приложения Java, мы можем прочитать, что
Инструмент java запускает приложение Java. Он делает это, запустив среду выполнения Java, загрузив класс указанный и вызывая этот класс main.
Итак, java
создает процесс для JVM, который будет загружать класс один и вызывать его основной метод.
Я не вижу никаких вариантов добавления других классов для выполнения своих основных методов с помощью команды java
. Если вы хотите, вы можете запустить новый поток /процесс внутри вашей программы, но он не изменит тот факт, что JVM будет запускать только один основной метод в Начало.