Найти тему

Вкратце о JVM, JRE и JDK

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

JVM

Несмотря на то, что языки программирования платформы Java, будь то Java, Kotlin, Groovy, Scala или даже Clojure, являются компилируемыми, написанные на них исходные коды компилируются в промежуточный байткод Java, а не в бинарные исполняемые файлы и библиотеки, как это обстоит с языками программирования вроде C, C++, Go, Rust и другими.

Да, существует проект GraalVM и некоторые другие, позволяющие компилировать исходные коды языков программирования платформы Java или даже байткод Java в бинарные исполняемые файлы и библиотеки, но эта тема выходит за рамки данной статьи.

В отличие от бинарных исполняемых файлов и библиотек, байткод Java независим от платформы, что является его достоинством и соответствует слогану платформы Java: "Write once, run anywhere" (англ. "Пиши один раз, запускай где угодно"). С другой стороны интерпретация байткода Java требует платформо-зависимого интерпретатора и дополнительных ресурсов. JVM — Java Virtual Machine или виртуальная машина Java и является этим самым интерпретатором байткода Java, а сам байткод, по сути, является языком ассемблера для JVM.

И если бы JVM занималась только интерпретацией, то программы для платформы Java серьёзно уступали в плане производительности программам, написанным на компилируемых языках программирования. Однако программы для платформы Java нередко демонстрируют сопоставимую производительность благодаря используемым в JVM JIT-компиляторам (Just in Time, во время исполнения).

Задача JIT-компилятора — компилировать "на ходу" часто используемые части байткода Java в набор нативных вызовов, благодаря чему повышается производительность программ, написанных для платформы Java.

Наиболее популярной виртуальной машиной Java является HotSpot с JIT-компиляторами C1 и C2. Впрочем, существуют как альтернативные JVM (например, Eclipse OpenJ9), так и альтернативные JIT-компиляторы (Graal).

Если вы только начинаете свой путь в разработке программного обеспечения для платформы Java, то, конечно же, не стоит обращать внимание на такие детали.

JRE

Однако для запуска программ, написанных для платформы Java, одной лишь JVM недостаточно — для этого требуются стандартная библиотека, утилиты и сертификаты, которые являются составляющими JRE — Java Runtime Environment, среды выполнения Java. Кроме утилит и стандартной библиотеки JRE, как правило, содержит и JVM, и отдельно их устанавливать и настраивать не требуется.

Проверить, установлена ли в системе JRE, вы можете при помощи команды java -version, пример вывода которой приведён ниже:

$ java -version
java version "21.0.2" 2024-01-16 LTS
Java(TM) SE Runtime Environment Oracle GraalVM 21.0.2+13.1 (build 21.0.2+13-LTS-jvmci-23.1-b30)
Java HotSpot(TM) 64-Bit Server VM Oracle GraalVM 21.0.2+13.1 (build 21.0.2+13-LTS-jvmci-23.1-b30, mixed mode, sharing)

Если вам нужно только запускать программы для платформы Java, то для этого в большинстве случаев достаточно JRE. Однако если вы хотите запускать программу, манипулирующую байткодом во время выполнения, или разрабатывать собственные программы, то вам потребуется расширенный набор инструментов — JDK.

JDK

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

Проверить, установлен ли в системе JDK, можно при помощи команды javac -version, пример вывода которой приведён ниже:

$ javac -version
javac 21.0.2

Версии JDK и JRE связаны с версиями языка программирования Java. Так, например, JDK 21 позволяют работать с языком программирования Java 21 версии. Стоит отметить, что версии платформы Java обратно совместимы. Это означает, что программа, разработанная для Java 11 будет корректно работать с JDK/JRE 21.

Но на самом деле с обратной совместимостью есть нюансы: так, например с релизом Java 9 из стандартной библиотеки были удалены классы, связанные с Java EE, из-за чего для запуска программ, использующих эти классы, на более новых версиях платформы Java нужно подключать дополнительные библиотеки.

Также стоит отметить, что есть версии JDK с долгосрочной поддержкой (LTS, Long-term Support) и краткосрочной поддержкой (STS, Short-term Support). LTS-версии являются более стабильными и поддерживаются как минимум до релиза следующей LTS-версии, а это, по крайней мере, 2 года. Но поставщики JDK могут поддерживать LTS-версии и дольше, так, например, BellSoft объявила о поддержке JDK 8 до 2031 года. Поддерживаемые в настоящее время LTS версии JDK: 8, 11, 17 и 21.

Версии с краткосрочной поддержкой поддерживаются разработчиками только до следующего релиза (STS или LTS), что составляет всего полгода. Использование версий JDK с краткосрочной поддержкой в условиях реальной эксплуатации сопряжено с рисками, например, обнаружения уязвимостей после окончания срока поддержки. Решение этой проблемы потребует повышения версии платформы Java, а это в свою очередь может потребовать изменений в коде, поэтому лучше использовать версии с краткосрочной поддержкой в образовательных целях.

Варианты установки JRE и JDK для операционных систем Windows и Linux будут описаны в следующих статьях.

OpenJDK

Основной реализацией JDK является проект с открытым исходным кодом OpenJDK, разрабатываемый сообществом, в жизни которого принимают активное участие Oracle, IBM, RedHat, Microsoft и другие. Сборки OpenJDK доступны для скачивания на официальном сайте проекта — openjdk.org, кроме этого многие участники сообщества предоставляют собственные сборки, которые могут отличаться деталями.

Совместимость сборок OpenJDK со стандартами платформы Java определяется прохождением TCK (Technology Compatibility Kit) — набора тестов совместимости. Так, если вы при разработке программы использовали только стандартные для платформы Java инструменты и сборку OpenJDK, например, от Oracle, то в дальнейшем программа должна корректно работать при использовании сборки OpenJDK от Azul, так как сборки OpenJDK от Oracle и Azul совместимы с TCK.

Различные сборки могут быть предназначены для различных ситуаций, так, например "полные" (Full) сборки JDK могут содержать кроме OpenJDK ещё и реализацию JavaFX — фреймворка для разработки программ с графическим пользовательским интерфейсом (GUI) для платформы Java. В то же время "серверные" сборки JRE будут иметь минимальный необходимый набор инструментов для запуска программ без GUI, и они хорошо подходят для облачных и контейнеризированных окружений ввиду своей минималистичности.

Если вы не знаете, какая сборка JDK вам нужна, то смотрите в сторону полных (full) сборок.

Популярные сборки OpenJDK

Итоги

  • JVM — виртуальная машина Java, выполняет байткод Java
  • JRE — среда выполнения Java, необходимая для запуска программ на платформе Java, в которую входит JVM
  • JDK — набор инструментов для разработки отладки программ для платформы Java
  • Если вам нужно запускать Java-программы, то достаточно JRE, если хотите разрабатывать их сами, то нужен JDK
  • OpenJDK — основная реализация JDK с открытым исходным кодом
  • TCK — набор тестов совместимости сборки JDK с платформой Java
  • В условиях реальной эксплуатации лучше использовать версии платформы Java с долгосрочной поддержкой (LTS)