← Назад к вопросам
Как связаны JVM и JRE?
1.6 Junior🔥 251 комментариев
#Основы Java#JVM и управление памятью
Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
# Как связаны JVM и JRE?
Краткий ответ
JVM (Java Virtual Machine) - это компонент JRE, отвечающий за выполнение bytecode. JRE (Java Runtime Environment) - это пакет, содержащий JVM, стандартную библиотеку и другие инструменты для запуска Java приложений.
Отношение: JRE содержит JVM.
Иерархия: JDK > JRE > JVM
JDK (Development Kit) - для разработки
|
+-- JRE (Runtime Environment) - для запуска
|
+-- JVM (Virtual Machine) - выполняет bytecode
+-- Классы и библиотеки
+-- Инструмент java
+-- Компилятор javac
+-- Инструменты отладки (jdb, jmap, jstack)
+-- javadoc
JVM (Java Virtual Machine)
Это виртуальная машина, которая выполняет Java bytecode на различных платформах.
Функции JVM:
- Чтение и выполнение bytecode (.class файлы)
- Just-in-Time компиляция - компилирует bytecode в машинный код
- Управление памятью - сборка мусора (GC)
- Безопасность - проверка границ, типов
- Многопоточность
Процесс:
Java код (.java) → javac → Bytecode (.class) → JVM → Машинный код
JVM один раз скомпилирует "горячий" код в машинный, потом выполняет быстро.
JRE (Java Runtime Environment)
Пакет всего необходимого для запуска Java программ (но не разработки).
Компоненты JRE:
- JVM - выполняет bytecode
- Стандартные библиотеки (java.lang, java.util, java.io)
- Инструмент java - запускает приложения
- Утилиты (jps, jstat - базовый мониторинг)
Использование:
# JRE - только для запуска
java -jar myapp.jar
java MyApplication
JDK (Java Development Kit)
Полный пакет для разработки. Включает JRE + инструменты разработчика.
Дополнительные компоненты JDK:
- Компилятор javac - компилирует .java в .class
- Отладчик jdb - отладка программ
- Профилировщик jstack, jmap, jconsole - анализ производительности
- jar - создание архивов
- javadoc - генерация документации
- keytool - работа с ключами
- Исходные коды стандартной библиотеки (src.zip)
Использование:
# JDK - для разработки
javac HelloWorld.java # Компилирование
java HelloWorld # Запуск
Сравнение
| Компонент | Цель | Размер | Содержит |
|---|---|---|---|
| JVM | Выполнение bytecode | ~60 MB | Виртуальная машина |
| JRE | Запуск приложений | ~150 MB | JVM + библиотеки + java |
| JDK | Разработка | ~300 MB | JRE + javac + инструменты |
Практический пример
Шаг 1: Разработка (нужен JDK)
# Разработчик использует JDK
javac HelloWorld.java # Компилирование (требует javac)
# Создаётся HelloWorld.class с bytecode
Шаг 2: Распространение
# Отправляем HelloWorld.class конечному пользователю
# Пользователю не нужен весь JDK, достаточно JRE
Шаг 3: Запуск (нужен JRE)
# Пользователь запускает с JRE
java HelloWorld
# JRE находит bytecode, передаёт в JVM
# JVM выполняет программу
Платформонезависимость
Это главное преимущество Java:
Bytecode одинаков на всех платформах
Java код → .class файл (одинаков везде)
↓
+-- Windows: JVM Windows → Машинный код Windows
+-- Linux: JVM Linux → Машинный код Linux
+-- macOS: JVM macOS → Машинный код macOS
Принцип: Write Once, Run Anywhere (WORA)
Память и GC
JVM управляет памятью автоматически:
byte[] array = new byte[1_000_000]; // 1 MB
// Когда объект выходит из области видимости,
// JVM (Garbage Collector) автоматически освобождает память
Это проще чем в C/C++, где нужно вручную управлять памятью.
В контейнере
# Для разработки
FROM openjdk:17-jdk
# Для боевого сервера (меньше размер)
FROM openjdk:17-jre
COPY app.jar /app/
CMD ["java", "-jar", "/app/app.jar"]
Выводы
- JVM - виртуальная машина для выполнения bytecode
- JRE = JVM + библиотеки (для запуска приложений)
- JDK = JRE + javac + инструменты (для разработки)
- Иерархия: JDK содержит JRE, JRE содержит JVM
- Для разработки → JDK
- Для запуска → JRE (или JDK)
- JVM обеспечивает платформонезависимость
- JVM управляет памятью автоматически (GC)