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