Что такое JVM, JDK, JRE? В чём разница между ними?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Что такое JVM, JDK, JRE? В чём разница между ними?
Это классический вопрос на собеседованиях Java-разработчиков, который проверяет понимание основной архитектуры платформы Java. Многие путают эти три аббревиатуры, поэтому давайте разберёмся детально.
JVM — Java Virtual Machine (Виртуальная машина Java)
JVM — это абстрактная виртуальная машина, которая исполняет Java bytecode (скомпилированный код Java в промежуточное представление).
Ключевые характеристики:
- Платформо-независимая (работает одинаково на Windows, Linux, macOS, и т.д.)
- Исполняет только bytecode, не Java код напрямую
- Разработана компанией Oracle, есть также открытые реализации (OpenJDK)
- Требует установки на операционную систему
- НЕ входит отдельно — всегда часть JRE или JDK
Пример работы JVM:
// Исходный Java код
public class Hello {
public static void main(String[] args) {
System.out.println("Hello, World!");
}
}
// После компиляции (javac Hello.java)
// Создаётся Hello.class с bytecode
// JVM читает и исполняет этот bytecode
Bytecode пример:
// Упрощённо выглядит примерно так:
LDC "Hello, World!"
INVOKEVIRTUAL System.out.println
RETURN
Зачем нужна виртуальная машина?
- Платформонезависимость — один скомпилированный .class файл работает везде
- Безопасность — JVM контролирует доступ к памяти
- Автоматическая оптимизация — JIT компиляция (Just-In-Time)
- Garbage Collection — автоматическое управление памятью
JRE — Java Runtime Environment (Среда выполнения Java)
JRE — это набор инструментов для запуска Java приложений. Это минимальный набор для конечных пользователей.
Что входит в JRE:
JRE
├── JVM (виртуальная машина)
├── Библиотеки классов (java.lang, java.util, и т.д.)
├── Утилиты (java, keytool, jarsigner)
└── Других инструментов разработки НЕТ
Характеристики JRE:
- Содержит JVM
- Содержит стандартные Java библиотеки (java., javax.)
- Содержит минимальный набор утилит
- Достаточен для запуска Java приложений
- НЕ достаточен для разработки (нет компилятора)
- Меньше по размеру, чем JDK (примерно 200 MB)
Пример использования JRE:
# Если установлен только JRE, можно запустить приложение
java -jar myapp.jar
# Но нельзя компилировать код
javac MyFile.java # ❌ Error: command not found
JDK — Java Development Kit (Набор инструментов разработчика)
JDK — это полный набор инструментов для разработки Java приложений. Это то, что нужно установить разработчикам.
Что входит в JDK:
JDK
├── JRE (весь функционал JRE)
│ ├── JVM
│ └── Библиотеки классов
├── Компилятор (javac)
├── Отладчик (jdb)
├── Архиватор (jar)
├── Генератор документации (javadoc)
├── Анализатор (jps, jcmd, jstat)
├── Утилиты профилирования
└── Другие инструменты разработки
Характеристики JDK:
- Содержит полностью JRE
- Содержит компилятор javac (самое важное отличие!)
- Содержит инструменты для отладки и профилирования
- Содержит документацию и примеры
- Требуется для разработки Java приложений
- Больше по размеру, чем JRE (примерно 500 MB+)
Основные утилиты JDK:
# Компиляция
javac HelloWorld.java
# Запуск
java HelloWorld
# Создание JAR архива
jar cvf myapp.jar *.class
# Просмотр содержимого класса
javap HelloWorld
# Отладка
jdb HelloWorld
# Генерация документации
javadoc HelloWorld.java
# Информация о процессах Java
jps
# Анализ Java процесса
jcmd <pid> help
Сравнительная таблица
| Параметр | JVM | JRE | JDK |
|---|---|---|---|
| Назначение | Выполнение bytecode | Запуск приложений | Разработка приложений |
| Компилятор (javac) | ❌ | ❌ | ✅ |
| Инструменты отладки | Часть JVM | ❌ | ✅ |
| Исходный код примеров | ❌ | ❌ | ✅ |
| Документация | ❌ | Минимум | ✅ |
| Размер | N/A | ~150-200 MB | ~300-500+ MB |
| Использование | Внутри JRE/JDK | Конечные пользователи | Разработчики |
| Зависимость | - | Содержит | Содержит |
Иерархия зависимостей
JDK
└── JRE
└── JVM
Другими словами:
JDK = JRE + инструменты разработки
JRE = JVM + библиотеки
JVM = исполняемый движок
Процесс компиляции и исполнения
┌─────────────────────────────────────────────────────┐
│ 1. Разработка (нужен JDK) │
├─────────────────────────────────────────────────────┤
│ │
│ HelloWorld.java (исходный код) │
│ ↓ │
│ [javac компилятор из JDK] │
│ ↓ │
│ HelloWorld.class (Java bytecode) │
│ │
└─────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────┐
│ 2. Распространение (нужен JRE) │
├─────────────────────────────────────────────────────┤
│ │
│ HelloWorld.class → [отправляем пользователю] │
│ │
└─────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────┐
│ 3. Выполнение (внутри JRE есть JVM) │
├─────────────────────────────────────────────────────┤
│ │
│ java HelloWorld [запуск] │
│ ↓ │
│ [JRE загружает класс] │
│ ↓ │
│ [JVM интерпретирует/компилирует bytecode] │
│ ↓ │
│ [Программа исполняется] │
│ │
└─────────────────────────────────────────────────────┘
Практические примеры
Сценарий 1: Конечный пользователь
Пользователь хочет запустить Java приложение
↓
Ои ему нужен JRE (НЕ нужен JDK)
↓
Он скачивает JRE
↓
java -jar myapp.jar ✓ Работает
javac MyFile.java ❌ Не установлен (нормально, не нужен)
Сценарий 2: Java разработчик
Разработчик хочет писать код на Java
↓
Он устанавливает JDK (который содержит JRE и JVM)
↓
javac MyFile.java ✓ Компилирует
java MyFile ✓ Запускает
javadoc MyFile.java ✓ Документирует
Типы JVM
1. HotSpot (Oracle JDK)
- Самая распространённая реализация
- Использует JIT компиляцию
- Оптимизирует горячие участки кода
2. OpenJ9 (IBM/Eclipse)
- Альтернативная реализация
- Может быть более эффективна для некоторых задач
3. GraalVM (Oracle)
- Современная реализация
- Поддерживает несколько языков (Java, JavaScript, Python)
- Можно компилировать в native image
Практический совет
# Проверить версию Java
java -version
# Узнать, что установлено
# Если есть только java → установлен JRE или JDK
java -version # ✓ Работает всегда если установлено что-то
# Если есть javac → точно установлен JDK
javac -version # ✓ Только в JDK
# Где установлено
which java
which javac
Заключение
- JVM — это движок, который исполняет bytecode
- JRE — это окружение для запуска готовых приложений (содержит JVM)
- JDK — это полный набор инструментов для разработки (содержит JRE и компилятор)
Простое правило:
- Конечный пользователь → установить JRE
- Разработчик → установить JDK (содержит всё необходимое)
- Вендор платформы Java → разрабатывает и поддерживает JVM