JDK, JRE, JVM

Тема дорожной карты · Java

JDK, JRE и JVM — три уровня платформы Java, и понимание различий между ними обязательно для каждого Java-разработчика и DevOps-инженера, развёртывающего Java-приложения. JVM (Java Virtual Machine) — нижний уровень: среда выполнения, загружающая файлы .class с байткодом через ClassLoader, проверяющая их корректность и исполняющая их интерпретацией или JIT-компиляцией в нативный машинный код; JVM также управляет кучей для Garbage Collection, обеспечивает соблюдение Java Memory Model для Java Concurrency и обеспечивает платформенную независимость, абстрагируясь от различий ОС и CPU. JRE (Java Runtime Environment) объединяет JVM с основными библиотеками классов (java.lang, java.util, java.io, java.sql и др.), необходимыми для запуска скомпилированных Java-приложений; в Java 8 и более ранних версиях конечные пользователи устанавливали JRE для запуска программ без инструментов разработки, а начиная с Java 11 Oracle прекратила распространять отдельный JRE — вместо этого минимальные кастомные среды выполнения собираются с помощью jlink. JDK (Java Development Kit) — это надмножество, включающее всё из JRE плюс инструменты разработчика: компилятор javac, генератор документации javadoc, REPL jshell, упаковщик jar, сборщик модульных сред jlink, а также jcmd, jstack, jmap и jvisualvm для профилирования и диагностики. В Docker-деплойментах многоэтапные сборки используют полный образ JDK (eclipse-temurin:21-jdk) для компиляции с Maven или Gradle, а затем копируют артефакт в облегчённый образ JRE (eclipse-temurin:21-jre) или кастомную среду, собранную jlink, чтобы минимизировать итоговый размер образа.

Как это работает

JDK, JRE, JVM компилирует исходник .java в байткод (.class), который исполняется на JVM (Java Virtual Machine). JVM даёт GC, JIT-компиляцию (HotSpot, GraalVM) и платформенную абстракцию. Основные дистрибутивы: OpenJDK (референс), Temurin (Eclipse, бесплатно, популярно), Liberica (BellSoft, удобная поддержка для РФ), Amazon Corretto. В production — LTS-версии (17, 21); non-LTS-релизы (каждые 6 месяцев) — для экспериментов с инструментами.

Когда применять

Java — для любого enterprise-backend, разработки Android (Kotlin или Java), проектов с гравитацией JVM-экосистемы (Spring, Hibernate, Kafka-клиент, Elasticsearch-клиент). Startup time + базовая память выше Go и Rust; экосистема библиотек + тулинга + observability непревзойдённа. Liberica или Temurin для production-сборок; пиньте major-версию + patch в CI.

Типичные ошибки

Ловушки JDK, JRE, JVM: Oracle JDK в production без коммерческой лицензии (бесплатно только не-prod с изменений 2019 — Temurin/Corretto/Liberica безопасные дефолты); пиннинг non-LTS-релиза (вынуждены обновляться каждые 6 месяцев); копирование туториалов для Java 8 (new ArrayList<Integer>()List.of(...); лямбды изменили композицию всего). Прочтите migration notes к целевому LTS.

Связанные понятия

Полезные ресурсы

Проверить знания (1)

Загрузка вопросов…