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

В чем разница между JDK, JRE и JVM?

1.0 Junior🔥 231 комментариев
#Основы Java

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

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

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

JDK vs JRE vs JVM: Различия и взаимосвязь

Это фундаментальные компоненты экосистемы Java, и непонимание их различий приводит к проблемам при разработке и развёртывании приложений.

JVM (Java Virtual Machine)

JVM — это виртуальная машина, которая выполняет Java код. Это абстрактная вычислительная машина, которая позволяет компьютеру работать как если бы он исполнял инструкции, специально написанные для JVM.

Как работает JVM

Java код (.java файл)
    ↓
Компиляция javac
    ↓
Bytecode (.class файл)
    ↓
JVM (на разных платформах)
    ↓
Нативный машинный код (зависит от ОС)

Ключевые характеристики JVM:

// Один и тот же класс работает везде
public class HelloWorld {
    public static void main(String[] args) {
        System.out.println("Hello, World!");
    }
}

// Скомпилируем
// javac HelloWorld.java → HelloWorld.class

// Запустим на разных платформах
// Windows:  java HelloWorld
// Linux:    java HelloWorld  
// MacOS:    java HelloWorld
// Везде работает одинаково благодаря JVM!

Функции JVM:

  • Исполнение bytecode
  • Управление памятью (Garbage Collection)
  • Just-In-Time (JIT) компиляция bytecode в машинный код
  • Безопасность (sandbox)
  • Многопоточность

JVM НЕ зависит от языка программирования:

Java code    →│        │← Kotlin code
Scala code   →│  JVM   │← Clojure code
Groovy code  →│        │← Jython code
                ↓
           Bytecode

Все эти языки компилируются в JVM bytecode и работают на одной JVM.

JRE (Java Runtime Environment)

JRE — это окружение для выполнения Java приложений. Это минимальный набор инструментов, необходимых для ЗАПУСКА уже скомпилированного Java кода.

Содержимое JRE

JRE
├── JVM (виртуальная машина)
├── Java Class Library (стандартная библиотека)
│   ├── java.lang
│   ├── java.io
│   ├── java.util
│   ├── java.net
│   ├── java.sql
│   └── ... (много других)
├── Поддерживающие файлы
└── НЕ содержит компилятор javac

Пример структуры JRE в системе

C:/Java/jre1.8.0_291/
├── bin/
│   ├── java.exe         # Запуск Java программ
│   ├── jps.exe          # Java Process Status
│   ├── jstack.exe       # Stack traces
│   └── jconsole.exe     # Мониторинг
├── lib/
│   ├── rt.jar           # Runtime классы
│   ├── jsse.jar         # SSL/TLS
│   └── ...
└── lib/security/
    └── java.policy      # Security политика

Когда используется JRE:

# Запуск приложения (только JRE нужна)
java -cp myapp.jar com.example.Main

# Запуск Spring Boot приложения
java -jar myapp.jar

# На production сервере — только JRE (экономим место)

Размер:

  • JRE: ~100-200 MB
  • Легче, чем JDK

JDK (Java Development Kit)

JDK — это полный набор инструментов для РАЗРАБОТКИ Java приложений. Это JRE + компилятор и другие утилиты.

Содержимое JDK

JDK
├── JRE (всё что есть в JRE)
├── Компилятор javac
├── Утилиты разработчика
│   ├── javac          # Компилятор
│   ├── jar            # Архивирование
│   ├── javadoc        # Документация
│   ├── jdb            # Debugger
│   ├── jps            # Process status
│   ├── jstat          # VM statistics
│   ├── jmap           # Memory map
│   ├── jstack         # Stack trace
│   └── ...
└── Исходные коды JRE (src.zip)

Пример структуры JDK

C:/Java/jdk1.8.0_291/
├── bin/
│   ├── java           # Запуск программ (из JRE)
│   ├── javac          # КОМПИЛЯТОР
│   ├── javadoc        # Генерирование документации
│   ├── jar            # Работа с архивами
│   ├── jdb            # Дебаггер
│   └── ... (еще много инструментов)
├── lib/
│   └── ... (библиотеки)
├── src.zip            # Исходные коды JRE
└── jre/               # JRE внутри JDK
    ├── bin/
    └── lib/

Когда используется JDK:

# Компиляция исходного кода
javac HelloWorld.java

# Запуск
java HelloWorld

# Создание jar файла
jar cvf myapp.jar HelloWorld.class

# Генерирование документации
javadoc *.java

# Дебаггинг
jdb HelloWorld

Размер:

  • JDK: ~300-500 MB
  • Больше, чем JRE, но необходим для разработки

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

                JVM         JRE         JDK
─────────────────────────────────────────────
Виртуальная     Да          Да          Да
машина

Библиотеки      —           Да          Да
Java            

Компилятор      —           —           Да
javac

Документация    —           —           Да
(javadoc)

Дебаггинг       —           —           Да
тулы

Для разработки  —           —           Да

Для запуска     —           Да          Да

Размер          ~50MB       ~100MB      ~300MB

Визуальная иерархия

┌─────────────────────────────────────┐
│            JDK                      │
│  (Development Kit)                  │
├─────────────────────────────────────┤
│ javac, javadoc, jar, jdb, etc.      │
│                                     │
│ ┌───────────────────────────────┐  │
│ │        JRE                    │  │
│ │  (Runtime Environment)        │  │
│ ├───────────────────────────────┤  │
│ │ Java Class Libraries          │  │
│ │ (java.lang, java.util, etc)   │  │
│ │                               │  │
│ │ ┌─────────────────────────┐  │  │
│ │ │       JVM               │  │  │
│ │ │ (Virtual Machine)       │  │  │
│ │ │ - Executes bytecode     │  │  │
│ │ │ - GC                    │  │  │
│ │ │ - JIT compilation       │  │  │
│ │ └─────────────────────────┘  │  │
│ └───────────────────────────────┘  │
└─────────────────────────────────────┘

Практические примеры

Развёртывание production

# Дома (разработка) — устанавливаем JDK
sudo apt install openjdk-17-jdk

# На production сервере — устанавливаем только JRE
sudo apt install openjdk-17-jre

# Запускаем приложение
java -jar application.jar

Настройка PATH

# Добавляем JDK/bin в PATH для доступа к инструментам
export PATH=$PATH:/usr/lib/jvm/java-17-openjdk/bin

# Теперь доступны
javac HelloWorld.java  # Компилятор
java HelloWorld        # Запуск
javadoc -d docs *.java # Документация

Проверка версий

# Проверка JVM версии
java -version
# java version "17.0.2" 2022-01-18

# Проверка компилятора (есть только в JDK)
javac -version
# javac 17.0.2

# Если компилятор недоступен, значит установлена только JRE

Современные дистрибутивы

В современной Java экосистеме существуют разные дистрибутивы JDK:

JDK дистрибутивы:
├── Oracle JDK
├── OpenJDK (free, open source)
├── Amazon Corretto
├── Eclipse Adoptium
├── Azul Zulu
└── GraalVM

Все содержат JVM + JRE + инструменты разработки.

Вывод

  • JVM — выполняет bytecode (независимо от платформы)
  • JRE — окружение для запуска Java приложений
  • JDK — полный набор для разработки Java приложений

Запомни: JDK ⊃ JRE ⊃ JVM (JDK содержит JRE, JRE содержит JVM)