Подтвердить что ты не робот

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

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

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

Ответ 3

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

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

Ответ 4

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

Ответ 5

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

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

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

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

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

Ответ 6

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

Ответ 7

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

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

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

Ответ 8

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

  1. Да, на процесс Java, на JVM.
  2. Runtime и ProcessBuilder следуют этому правилу.
  3. Загрузка банок с использованием рефлексии и последующее выполнение основного не вызовет новую JVM.