Чи існує одна 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

Однак трохи пізно, однак ця інформація може бути корисною для когось. Якщо ви хочете знати, скільки JVM працює в системі Linux, ви можете спробувати цю команду

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

psперерахувати процес, grepзнайти процес, що містить "java", і wcпідрахувати повернуті рядки


0

Насправді це одне питання, яке може мати дуже заплутані відповіді. Щоб це було по-справжньому коротким:

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