Есть ли одна JVM для каждого приложения Java?


91

Используется ли одна и та же JVM всеми запущенными приложениями Java или применяется «одна JVM для каждого приложения Java»? (скажем, приложения - это IntelliJ IDEA, например, сервер и NetBeans)

Кроме того, существует ли какая-либо связь между назначенными JVM и процессами, используемыми каждым приложением Java?


2
Это большой вопрос. :)
jamie

Ответы:


81

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

Есть некоторые детали реализации, такие как совместное использование данных классов , когда несколько экземпляров JVM могут совместно использовать некоторые данные / память, но они не оказывают видимого пользователю эффекта на приложения (за исключением улучшенного времени запуска, надеюсь).

Однако распространенным сценарием является один сервер приложений (или «веб-сервер»), такой как Glassfish или Tomcat, на котором выполняется несколько веб-приложений. В этом случае несколько веб-приложений могут совместно использовать JVM.


21

На каждое приложение Java приходится одна JVM. Между ними не должно быть никакой связи, если вы ее не установите, например, в сети. Если вы работаете внутри IDE, код, который вы пишете, обычно выполняется в отдельной JVM. IDE обычно подключает отдельную JVM для отладки. Если вы имеете дело с несколькими веб-приложениями, они могут использовать одну и ту же JVM, если они развернуты в одном веб-контейнере.


12

Теоретически вы можете запускать несколько приложений в JVM. На практике они могут мешать друг другу по-разному. Например :

  • JVM имеет один набор System.in/ out/ err, одну кодировку по умолчанию, одну локаль по умолчанию, один набор системных свойств и так далее. Если одно приложение изменяет их, это влияет на все приложения.
  • Любое приложение, которое вызывает, System.exit()убивает все приложения.
  • Если один поток приложения выходит из строя и потребляет слишком много ресурсов ЦП или памяти, это также влияет на другие приложения.

8

Количество запущенных JVM - это количество запущенных исполняемых файлов. Каждое такое приложение вызывает свой собственный исполняемый файл java (java.exe / javaw.exe etx для Windows), что означает, что каждое из них работает в отдельной JVM.


8

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

Все зависит от того, что вы считаете «приложением». IDE - хороший пример приложения, которое представляется своим конечным пользователям (т. Е. Нам) как единое целое, но на самом деле состоит из нескольких базовых приложений (компиляторы, средства запуска тестов, инструменты статического анализа, упаковщики, менеджеры пакетов, проект / инструменты управления зависимостями и т. д.). В этом случае существует множество уловок, которые IDE использует, чтобы гарантировать, что пользователь получит интегрированный опыт, а также будет защищен (в некоторой степени) от индивидуальных капризов базовых инструментов. Один из таких приемов состоит в том, чтобы делать некоторые вещи в отдельной JVM, взаимодействуя либо через текстовые файлы, либо через средства отладки на уровне приложения.

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

Итак, все действительно зависит от того, что вы считаете собой application. Если вы говорите чисто о том, «что запускается при вызове main ()», то вы смотрите на одно приложение для каждой JVM - когда ОС запускает JVM, JVM запускает public static void main()метод одного класса .

Но как только ваши приложения начнут усложняться, ваши границы станут более размытыми. IDE, такая как Intellij или Eclipse, будет повторно использовать большую часть того же материала, что и javac, либо в той же JVM, либо в другой, а также выполнять другую работу (например, перерисовывать экран). И пользователи веб-приложения на сервере приложений (совместно используемой JVM) могут фактически использовать почти то же «основное» приложение, которое можно использовать локально через командную строку.


5

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


2

Немного поздно, но эта информация может быть кому-то полезна. В системе Linux, если вы хотите узнать, сколько JVM запущено, вы можете попробовать эту команду

$ ps -ef | grep "[j]ava" | wc -l

psдля перечисления процесса, grepдля поиска процесса, содержащего "java", и wcдля подсчета возвращенных строк


0

На самом деле это тот вопрос, на который могут быть очень запутанные ответы. Короче:

  1. Да, для каждого процесса Java, для JVM.
  2. Среда выполнения и ProcessBuilder следуют этому правилу.
  3. Загрузка jar-файлов с использованием отражения и последующее выполнение основного не приведет к созданию новой JVM.
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.