Логотип Workflow

Article

Jvm Jdk Jre

Тема 2. JVM, JDK, JRE

Эта тема нужна не для «заучивания терминов», а для практики: чтобы вы могли установить Java, собрать программу, запустить ее и быстро понять, почему запуск не работает.

Зачем вообще разделять JVM, JRE и JDK

В Java есть три разных уровня, и каждый отвечает за свою задачу:

  1. JVM исполняет байткод (.class) и управляет выполнением программы.
  2. JRE дает среду выполнения: JVM + стандартные библиотеки, без которых код не запустится.
  3. JDK дает инструменты разработчика: компилятор javac, утилиты сборки, отладки и диагностики.

Практическое правило:

  • Если вы пишете и компилируете код, нужен JDK.
  • Если вы только запускаете готовое приложение, нужна runtime-среда.
  • В современных версиях Java обычно устанавливают сразу JDK, потому что он покрывает оба сценария.

Что делает JVM на практике

Когда вы запускаете java App, JVM:

  1. загружает классы (ClassLoader),
  2. проверяет байткод на корректность,
  3. выделяет и освобождает память,
  4. исполняет код сначала интерпретацией, а горячие участки оптимизирует через JIT,
  5. взаимодействует с ОС через единый слой абстракции.

Именно поэтому один и тот же байткод можно запускать на разных ОС без переписывания исходников.

Где здесь JRE

JRE отвечает на вопрос: «Что нужно, чтобы программа работала в рантайме?». Это:

  • JVM,
  • базовые библиотеки Java (java.lang, java.util, java.io и т.д.),
  • служебные runtime-компоненты.

Если в окружении нет корректной runtime-части, приложение не запустится даже при полностью валидном исходном коде.

Где здесь JDK

JDK нужен на этапе разработки. Ключевые инструменты:

  • javac компилирует .java в .class,
  • java запускает приложение,
  • javadoc генерирует документацию,
  • jdb, jcmd, jstack, jmap помогают отлаживать и диагностировать поведение приложения.

Итоговая связь уровней:

  • JDK включает runtime-часть.
  • Runtime-часть включает JVM.

JDK JRE JVM

Пошаговый минимальный цикл (для новичка)

Шаг 1. Создайте файл

public class App {
    public static void main(String[] args) {
        System.out.println("Runtime via JVM");
    }
}

Шаг 2. Скомпилируйте

javac App.java

Что произошло: компилятор из JDK создал App.class.

Шаг 3. Запустите

java App

Что произошло: JVM загрузила байткод и выполнила метод main.

Шаг 4. Проверьте окружение, если есть ошибка

java -version
javac -version
echo $JAVA_HOME
which java
which javac

Типичные проблемы и как их чинить

  1. java и javac показывают разные major-версии. Причина: в PATH попали бинарники из разных установок.

  2. JAVA_HOME указывает на старую Java. Причина: переменная окружения не обновлена после переустановки.

  3. Проект собран на Java 21, а запускается на Java 17. Причина: разные версии локально, в CI и в production.

Рабочее правило для команды: фиксируйте одну целевую версию Java и проверяйте ее одинаково в локальной разработке, CI и runtime-среде.

Что нужно запомнить

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

Quiz

Проверьте, что вы усвоили

Авторизуйтесь чтоб пройти тесты