Существует ли одна JVM для каждого приложения Java? - PullRequest
75 голосов
/ 10 мая 2011

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

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

Ответы [ 7 ]

67 голосов
/ 10 мая 2011

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

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

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

15 голосов
/ 10 мая 2011

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

7 голосов
/ 27 ноября 2015

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

The JVM has one set of System.in/out/err, one default encoding, one default locale, one set of system properties, and so on. If one application changes these, it affects all applications.
Any application that calls System.exit() kills all applications.
If one application thread goes wild, and consumes too much CPU or memory it will affect the other applications too.

Refrence

7 голосов
/ 10 мая 2011

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

5 голосов
/ 10 мая 2011

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

4 голосов
/ 24 декабря 2017

Краткий ответ: часто да, вы получите одно приложение на 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) могут фактически использовать то же «базовое» приложение, которое можно использовать локально через командную строку.

2 голосов
/ 08 февраля 2017

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

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

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

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