Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
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)