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

Что такое JVM, JDK, JRE? В чём разница между ними?

2.0 Middle🔥 141 комментариев
#JVM и управление памятью

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Что такое 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

Сравнительная таблица

ПараметрJVMJREJDK
НазначениеВыполнение 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
Что такое JVM, JDK, JRE? В чём разница между ними? | PrepBro