Тема 2. JVM, JDK, JRE
Эта тема нужна не для «заучивания терминов», а для практики: чтобы вы могли установить Java, собрать программу, запустить ее и быстро понять, почему запуск не работает.
Зачем вообще разделять JVM, JRE и JDK
В Java есть три разных уровня, и каждый отвечает за свою задачу:
JVMисполняет байткод (.class) и управляет выполнением программы.JREдает среду выполнения: JVM + стандартные библиотеки, без которых код не запустится.JDKдает инструменты разработчика: компиляторjavac, утилиты сборки, отладки и диагностики.
Практическое правило:
- Если вы пишете и компилируете код, нужен
JDK. - Если вы только запускаете готовое приложение, нужна runtime-среда.
- В современных версиях Java обычно устанавливают сразу
JDK, потому что он покрывает оба сценария.
Что делает JVM на практике
Когда вы запускаете java App, JVM:
- загружает классы (
ClassLoader), - проверяет байткод на корректность,
- выделяет и освобождает память,
- исполняет код сначала интерпретацией, а горячие участки оптимизирует через JIT,
- взаимодействует с ОС через единый слой абстракции.
Именно поэтому один и тот же байткод можно запускать на разных ОС без переписывания исходников.
Где здесь 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.
Пошаговый минимальный цикл (для новичка)
Шаг 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
Типичные проблемы и как их чинить
-
javaиjavacпоказывают разные major-версии. Причина: вPATHпопали бинарники из разных установок. -
JAVA_HOMEуказывает на старую Java. Причина: переменная окружения не обновлена после переустановки. -
Проект собран на Java 21, а запускается на Java 17. Причина: разные версии локально, в CI и в production.
Рабочее правило для команды: фиксируйте одну целевую версию Java и проверяйте ее одинаково в локальной разработке, CI и runtime-среде.
Что нужно запомнить
JDKнужен разработчику.JVMвыполняет код.- Ошибки Java-окружения чаще всего решаются проверкой версий и путей, а не переписыванием бизнес-логики.