← Назад к вопросам

Как связаны 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:

  1. Чтение и выполнение bytecode (.class файлы)
  2. Just-in-Time компиляция - компилирует bytecode в машинный код
  3. Управление памятью - сборка мусора (GC)
  4. Безопасность - проверка границ, типов
  5. Многопоточность

Процесс:

Java код (.java) → javac → Bytecode (.class) → JVM → Машинный код

JVM один раз скомпилирует "горячий" код в машинный, потом выполняет быстро.

JRE (Java Runtime Environment)

Пакет всего необходимого для запуска Java программ (но не разработки).

Компоненты JRE:

  1. JVM - выполняет bytecode
  2. Стандартные библиотеки (java.lang, java.util, java.io)
  3. Инструмент java - запускает приложения
  4. Утилиты (jps, jstat - базовый мониторинг)

Использование:

# JRE - только для запуска
java -jar myapp.jar
java MyApplication

JDK (Java Development Kit)

Полный пакет для разработки. Включает JRE + инструменты разработчика.

Дополнительные компоненты JDK:

  1. Компилятор javac - компилирует .java в .class
  2. Отладчик jdb - отладка программ
  3. Профилировщик jstack, jmap, jconsole - анализ производительности
  4. jar - создание архивов
  5. javadoc - генерация документации
  6. keytool - работа с ключами
  7. Исходные коды стандартной библиотеки (src.zip)

Использование:

# JDK - для разработки
javac HelloWorld.java   # Компилирование
java HelloWorld         # Запуск

Сравнение

КомпонентЦельРазмерСодержит
JVMВыполнение bytecode~60 MBВиртуальная машина
JREЗапуск приложений~150 MBJVM + библиотеки + java
JDKРазработка~300 MBJRE + 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"]

Выводы

  1. JVM - виртуальная машина для выполнения bytecode
  2. JRE = JVM + библиотеки (для запуска приложений)
  3. JDK = JRE + javac + инструменты (для разработки)
  4. Иерархия: JDK содержит JRE, JRE содержит JVM
  5. Для разработки → JDK
  6. Для запуска → JRE (или JDK)
  7. JVM обеспечивает платформонезависимость
  8. JVM управляет памятью автоматически (GC)