Чем отличаются JDK, JRE и JVM? Как исполняется Java-код?
- JVM (Java Virtual Machine) — виртуальная машина, исполняющая байткод. Своя реализация под каждую платформу — отсюда «написано однажды, работает везде».
- JRE (Java Runtime Environment) — JVM плюс стандартные библиотеки. Достаточно для запуска.
- JDK (Java Development Kit) — JRE плюс инструменты разработки: компилятор
javac, отладчик,jar,jshell. Начиная с Java 11 отдельный JRE обычно не распространяется — ставят JDK.
Путь кода:
javacкомпилирует.javaв байткод (.class) — промежуточное представление, не машинный код.- Загрузчик классов подгружает классы лениво, по мере обращения.
- Верификатор проверяет байткод на корректность.
- Байткод сначала интерпретируется, а часто выполняемые («горячие») методы JIT-компилятор (C1, затем C2) переводит в оптимизированный машинный код с учётом реальной статистики выполнения.
Поэтому Java-приложение «разогревается»: первые запросы медленнее, чем последующие. Для быстрого старта (serverless, CLI) есть AOT-компиляция через GraalVM Native Image.
- Что такое загрузчики классов и их иерархия?
- Почему Java-сервис медленнее на первых запросах?