Словарь ИИ

JVM vs JRE vs JDK: в чем разница

JVM vs JRE vs JDK: в чем разница

JVM исполняет байткод, JRE дает среду для запуска Java-программ, а JDK добавляет инструменты разработки и включает JRE. Коротко: писать код удобно с JDK, запускать готовую программу можно через JRE, а в основе всего работает JVM.

Эти три термина часто путают, потому что они связаны и частично вложены друг в друга. Ниже — без путаницы: что делает каждый компонент, как они соотносятся и в каких случаях нужен именно он.

Содержание статьи

Что такое JVM

JVM — это виртуальная машина Java, которая загружает, проверяет и исполняет байткод. Она служит слоем между Java-программой и конкретной операционной системой.

Когда разработчик компилирует исходный код Java, он получает не машинный код для Windows, Linux или macOS, а байткод. Именно JVM берет этот байткод и исполняет его на конкретной платформе. За счет этого одна и та же программа может работать на разных системах, если для них есть совместимая JVM.

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

Какую роль JVM играет в Java

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

Эта схема известна по принципу write once, run anywhere, но работает она при важной оговорке: на целевом устройстве должна быть совместимая реализация JVM. Без нее байткод сам по себе не запустится.

JVM также может исполнять код не только из Java, если другой язык умеет компилироваться в Java-байткод. Поэтому экосистема JVM шире самой Java.

Из чего состоит JVM

У JVM есть три ключевых подсистемы: загрузка классов, области данных времени выполнения и движок исполнения.

  • Class Loader Subsystem загружает классы, связывает их и инициализирует во время работы программы.
  • Runtime Data Areas хранят данные выполнения: стек, кучу, регистры счетчика команд, области методов и данные потоков.
  • Execution Engine исполняет байткод через интерпретацию и компиляцию, а также работает вместе со сборщиком мусора.

Сборщик мусора освобождает память от объектов, которые больше не используются. Это одна из причин, почему разработчику на Java не нужно вручную освобождать память так, как в ряде других языков.

Что такое JNI и зачем он нужен

JNI — это Java Native Interface, механизм связи Java-кода с нативным кодом. Он нужен, когда программе требуется взаимодействие с библиотеками или функциями, завязанными на конкретную ОС или оборудование.

Через JNI Java-приложение может вызывать код на других языках, а нативный код может вызывать методы Java. Такой подход используют там, где нужен доступ к системным возможностям вне стандартной среды Java.

Что такое JRE

JRE — это среда выполнения Java-программ. Она включает JVM и набор библиотек и компонентов, которые нужны для запуска готового приложения.

Если задача сводится к запуску уже собранной Java-программы, без компиляции и отладки исходников, обычно достаточно JRE. Она предоставляет все необходимое для выполнения кода, который уже переведен в байткод.

Проще всего смотреть на JRE так: JVM — это двигатель, а JRE — комплект, в котором этот двигатель уже встроен вместе с базовыми средствами для работы программы.

Когда нужен JRE

JRE нужен для запуска, а не для разработки. Если пользователь только открывает Java-приложение, компилятор и средства сборки ему не требуются.

На практике это различие сегодня стало менее очевидным, потому что современные поставки Java часто идут через JDK, а отдельное распространение JRE встречается реже, чем раньше. Но концептуально разница остается прежней: JRE отвечает за выполнение программы.

Что входит в JRE

JRE включает JVM, стандартные библиотеки Java и вспомогательные компоненты среды выполнения. Без этого набора большинство Java-программ просто не стартует.

В такой среде находятся API и библиотеки, которыми приложение пользуется во время работы: работа с коллекциями, потоками, журналированием, графическим интерфейсом, доступом к данным и другими базовыми возможностями платформы.

Компонент Что делает
JVM Исполняет байткод и управляет выполнением программы
Стандартные библиотеки Дают готовые классы для строк, коллекций, потоков, файлов, сети и других задач
Графические библиотеки Поддерживают интерфейсы через AWT, Swing и связанные API
Средства доступа к данным Позволяют работать с базами данных и каталогами через JDBC и JNDI
Служебные компоненты Поддерживают журналирование, настройки, архивы JAR и параллельное выполнение

Какие библиотеки и API обычно связывают с JRE

Чаще всего с JRE связывают стандартные API, которые нужны приложению уже во время запуска. Это не отдельные внешние пакеты, а часть базовой Java-платформы.

  • Java 2D используется для двумерной графики.
  • AWT дает базовые элементы графического интерфейса.
  • Swing расширяет возможности настольных интерфейсов.
  • JDBC обеспечивает доступ к реляционным базам данных.
  • JNDI работает с именованием и каталогами.
  • Collections Framework предоставляет стандартные структуры данных.
  • Concurrency Utilities помогают строить многопоточные программы.
  • Logging отвечает за журналы событий.
  • JAR служит форматом упаковки файлов Java-приложения.

Что такое JDK

JDK — это набор для разработки на Java. Он включает JRE и инструменты, которые нужны для компиляции, отладки, сборки и анализа программ.

Если JRE рассчитан на запуск, то JDK нужен тем, кто пишет и собирает код. В нем есть компилятор, служебные утилиты и исполняемые файлы для работы с исходниками и артефактами проекта.

Поэтому для разработчика базовый выбор почти всегда очевиден: нужен JDK. Он покрывает и создание программы, и ее запуск.

Что входит в JDK

В JDK входят JRE, компилятор javac, отладочные и архивные утилиты, а также другие инструменты платформы. Это полный комплект для работы с Java-кодом.

После написания исходников разработчик компилирует их в байткод. Затем тот же набор средств помогает запускать, отлаживать и упаковывать приложение. Из-за этого JDK обычно ставят и на рабочую машину разработчика, и в среды сборки.

Ниже — краткая схема различий.

Компонент Главная задача Кому нужен
JVM Исполнение байткода Любой системе, где запускается Java-код
JRE Среда выполнения Java-приложений Пользователю или серверу для запуска
JDK Разработка, компиляция, отладка и запуск Разработчику и системе сборки

Какие инструменты JDK используются чаще всего

Самые известные инструменты JDK — javac, javadoc и средства отладки. Они закрывают базовые этапы работы с проектом.

  1. javac компилирует исходный код Java в байткод.
  2. javadoc генерирует HTML-документацию по исходникам и комментариям API.
  3. jar упаковывает классы и ресурсы в архив JAR.
  4. jdb помогает отлаживать приложение.

Как JVM, JRE и JDK связаны между собой

Связь простая: JDK включает JRE, а JRE включает JVM. Вложенность идет от самого широкого набора к самому базовому механизму исполнения.

Если смотреть сверху вниз, картина такая. Разработчик пишет код с помощью JDK. Этот код компилируется в байткод. Дальше JRE предоставляет среду для запуска, а JVM исполняет сам байткод на конкретной машине.

Из-за этой иерархии многие говорят, что JDK — это все, что нужно разработчику, а JVM — фундамент выполнения. Формулировка грубая, но для первого понимания удобная.

JDK, JRE и JVM: ключевые различия в одной таблице

Главное различие в назначении. JVM исполняет, JRE запускает, JDK позволяет разрабатывать и тоже запускать.

Критерий JVM JRE JDK
Что это Виртуальная машина Среда выполнения Набор разработки
Главная функция Запуск байткода Запуск Java-приложений Создание, компиляция, отладка и запуск
Содержит JVM Нет, это и есть JVM Да Да
Содержит компилятор Нет Нет Да
Нужен разработчику Косвенно Обычно недостаточно Да
Нужен для запуска программы Да Да Да

Что выбрать в разных задачах

Для разработки нужен JDK. Для запуска готового Java-приложения концептуально достаточно JRE, а JVM — обязательная часть среды выполнения.

Если задача практическая, без теории, правило короткое: разработчик ставит JDK. Пользователь, который только запускает программу, исторически обходился JRE. Сервер, на котором собирают и запускают приложение, тоже часто использует JDK, потому что он закрывает оба сценария.

  • Пишете код на Java — нужен JDK.
  • Компилируете проект — нужен JDK.
  • Отлаживаете приложение — нужен JDK.
  • Только запускаете готовый байткод — достаточно среды выполнения с JVM.

Что такое Java SE и чем она отличается от Java EE

Java SE — это базовая платформа Java со стандартными возможностями языка и библиотек. Java EE исторически добавляла API для крупных корпоративных приложений.

Когда говорят просто Java в базовом учебном или прикладном контексте, чаще всего имеют в виду Java SE. Именно в ее рамках обычно объясняют различия между JVM, JRE и JDK. Эта тема относится к основам платформы, а не к корпоративным надстройкам.

Как JIT, javac и javadoc дополняют эту схему

JIT, javac и javadoc решают разные задачи на разных этапах. javac компилирует исходники в байткод, JIT ускоряет исполнение байткода внутри JVM, а javadoc создает документацию по коду.

Эти инструменты часто упоминают рядом, но путать их роли не стоит. javac относится к этапу разработки и входит в JDK. JIT относится к этапу выполнения и работает внутри JVM. javadoc помогает документировать API и тоже относится к инструментам разработки.

Как JVM связана с виртуальными машинами и контейнерами

JVM сама по себе не равна виртуальной машине уровня сервера. Она запускается внутри операционной системы и исполняет Java-байткод, а серверные виртуальные машины и контейнеры решают задачу изоляции приложений на уровне инфраструктуры.

Виртуальная машина уровня инфраструктуры эмулирует или абстрагирует аппаратную среду и позволяет запускать несколько систем на одном физическом сервере. Контейнер работает легче: он использует ядро хостовой ОС и изолирует приложение вместе с его зависимостями.

Java-приложение с JVM может работать и внутри обычной ОС, и внутри виртуальной машины, и внутри контейнера. Эти уровни не исключают друг друга, а накладываются.

Частые ошибки в понимании JVM, JRE и JDK

Самая частая ошибка — считать эти термины взаимозаменяемыми. Они связаны, но обозначают разные части Java-платформы.

Еще одна ошибка — думать, что JVM компилирует исходный код Java. Исходный код сначала обрабатывает компилятор, обычно javac, и только потом JVM исполняет результат. Также неверно считать, что JRE подходит для полноценной разработки: без инструментов JDK этого недостаточно.

  1. JVM и JRE — не одно и то же. JVM входит в JRE.
  2. JRE и JDK — не одно и то же. JRE входит в JDK.
  3. JVM не заменяет компилятор. Она исполняет байткод, а не исходники.
  4. Для разработки одного JRE мало. Нужен JDK.

Краткий вывод по теме

JVM исполняет байткод, JRE предоставляет среду выполнения, JDK дает полный набор для разработки. Если запомнить эту иерархию, путаница исчезает.

На практике выбор обычно сводится к одному правилу. Есть разработка — ставят JDK. Есть только запуск готового Java-приложения — нужна среда выполнения с JVM. Все остальное уже детали платформы и конкретной поставки Java.