Когда несколько программ Java работают на одном компьютере

83

Каждое приложение Java запускается в определенном экземпляре виртуальной машины Java. Я действительно запутался в следующих аспектах, а поиск в Google запутал меня еще больше. Разные статьи на разных сайтах.

  1. Если у меня есть веб-служба, написанная на java, для ее запуска потребуется экземпляр JVM. Можно ли сделать JVM процессом-демоном?

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

  3. Оперативная память, доступная на любой машине, постоянна. Когда мы запускаем n java-процессов одновременно без предоставления начального размера кучи, как размер кучи распределяется между процессами?

  4. Есть ли какой-либо процесс, который управляет n экземплярами JVM, или он управляется самой ОС?

  5. Когда происходит остановка мира во время сборки мусора, затрагиваются ли другие экземпляры JVM (я полагаю, разные потоки)?

Аникет Такур
источник
2
Ваш первый момент зависит от реализации контейнера ...
MadProgrammer
6
+1 за подробное объяснение и изучение вопроса, прежде чем задавать.
amod

Ответы:

80

1) Если у меня есть веб-служба, написанная на java, для запуска ей потребуется экземпляр JVM. Так можно ли сделать JVM процессом демона?

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

2) Если да, то при запуске любого другого Java-приложения оно будет использовать этот экземпляр JVM или создать новый?

Нет. Каждое приложение Java использует независимую JVM.

Каждая JVM - это отдельный процесс, а это означает, что нет совместного использования стеков, куч и т. Д. (Как правило, единственное, что может быть общим, - это сегменты только для чтения, которые содержат код основной JVM и собственных библиотек ... так же, как обычные процессы могут совместно использовать сегменты кода.)

3) Оперативная память, доступная на любой машине, постоянна. Когда мы запускаем n java-процессов одновременно без предоставления начального размера кучи, как размер кучи распределяется между процессами?

Механизм определения размера кучи, если вы не укажете размер, зависит от используемой JVM / платформы / версии, а также от того, используете ли вы модель «клиент» или «сервер» (для JVM Hotspot). Эвристика не учитывает количество или размер других JVM.

Ссылка: https://stackoverflow.com/a/4667635/139985

На практике вам, вероятно, будет лучше напрямую указать размер кучи.

4) Есть ли какой-либо процесс, который управляет n экземплярами JVM, или он управляется самой ОС?

Ни то, ни другое. Количество экземпляров JVM определяется действиями различных вещей, которые могут запускать процессы; например, сценарии демонов, командные сценарии, пользователи, вводящие команды в командной строке и т. д. В конечном итоге ОС может отказаться запускать какие-либо другие процессы, если у нее заканчиваются ресурсы, но JVM не обрабатываются иначе, чем другие процессы.

5) Когда происходит остановка мира во время сборки мусора, затрагиваются ли другие экземпляры JVM (я полагаю, разные потоки)?

Нет. JVM - это независимые процессы. У них нет никаких изменчивых состояний. Сборка мусора работает на каждой JVM независимо.

Стивен С
источник
10
  1. см. Как демонизировать Java-программу?
  2. будет создан новый экземпляр JVM
  3. так же, как память распределяется между всеми другими процессами
  4. им управляет O / S
  5. другие экземпляры не затронуты

Если вашим экземплярам необходимо координировать свою работу, вы можете создать один главный экземпляр, который будет запускать / останавливать другие экземпляры.

Вы не объяснили, зачем вам нужно несколько экземпляров JVM. Наверное, лучше подойдет единичный экземпляр.

Алексей Кайгородов
источник