← Назад к вопросам
В чем разница между JVM и JDK?
1.0 Junior🔥 211 комментариев
#Основы Java#JVM и управление памятью
Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
# Разница между JVM и JDK
Краткий ответ
- JVM (Java Virtual Machine) — виртуальная машина, которая ВЫПОЛНЯЕТ скомпилированный Java код
- JDK (Java Development Kit) — полный набор инструментов для РАЗРАБОТКИ Java приложений (включает JVM, компилятор, библиотеки и утилиты)
Это как разница между двигателем машины (JVM) и всем, что нужно для её постройки (JDK).
Структура и компоненты
JDK (Java Development Kit) — инструментарий разработчика
JDK (Java Development Kit)
├── JVM (Java Virtual Machine) ← Выполнение
├── JRE (Java Runtime Environment)
│ ├── JVM
│ ├── java.lang, java.util, ... (стандартные библиотеки)
│ └── Другие runtime компоненты
├── Компилятор (javac) ← Разработка
├── Инструменты отладки (jdb, jstack, jmap, ...)
├── Утилиты (jar, jarsigner, jcmd, ...)
├── Документация (javadoc)
└── Исходный код стандартной библиотеки
JVM (Java Virtual Machine) — только выполнение
JVM
├── Class Loader
├── Bytecode Verifier
├── Execution Engine
│ ├── Interpreter
│ └── JIT Compiler (Just-In-Time)
└── Garbage Collector
Жизненный цикл Java кода
Разработка (используется JDK)
1. Пишешь код
↓
MyProgram.java
2. Компилируешь (javac из JDK)
↓
javac MyProgram.java
↓
MyProgram.class (bytecode)
Выполнение (используется JVM)
3. Запускаешь (java из JDK/JRE)
↓
java MyProgram
↓
JVM загружает MyProgram.class
↓
JVM интерпретирует/компилирует bytecode
↓
JVM выполняет на машине (x86, ARM, ...)
Аналогия из реальной жизни
JDK = Фабрика
Фабрика (JDK):
├── Инженеры (компилятор javac)
├── Чертежи (исходный код)
├── Оборудование (IDE, tools)
├── Рабочие (JVM для тестирования)
└── Документация (javadoc)
Процесс:
1. Инженеры проектируют машину (write code)
2. Создают чертежи в стандартном формате (compile .java → .class)
JVM = Двигатель
Двигатель (JVM):
├── Приёмник топлива (class loader)
├── Фильтр (bytecode verifier)
├── Поршни (execution engine)
└── Система охлаждения (garbage collector)
Процесс:
1. Загружает чертежи машины (.class файлы)
2. Проверяет чертежи (bytecode verification)
3. Запускает двигатель (JIT compilation)
4. Выполняет на реальной машине (native code)
Практические различия
Для разработки нужен JDK
# Проверить, установлен ли JDK
java -version # Есть
javac -version # Есть ← JDK имеет javac компилятор
jar -version # Есть ← JDK имеет jar утилиту
# Компилирование (нужен javac из JDK)
javac MyProgram.java # ← Только в JDK
Для запуска нужен JVM (включён в JDK или JRE)
# Запуск (нужен java/JVM)
java MyProgram # ← JVM выполняет
# JRE (облегченная версия для запуска)
# содержит JVM, но НЕ содержит javac компилятор
Компоненты JDK в деталях
1. JVM — Виртуальная машина
// Как работает JVM
public class JVMExample {
public static void main(String[] args) {
int a = 5;
int b = 3;
int sum = a + b;
System.out.println(sum); // 8
}
}
Процесс в JVM:
1. Class Loading → Загрузить JVMExample.class
2. Linking → Проверить, связать, подготовить
3. Initialization → Инициализировать переменные
4. Execution → Выполнить bytecode
↓
Interpreter или JIT Compiler переводит bytecode в машинный код
↓
Процессор выполняет машинный код
↓
Выведет: 8
2. Компилятор (javac) — только в JDK
# Компилятор переводит .java в .class
javac MyProgram.java
# .class файл содержит bytecode (промежуточное представление)
# Это независимо от платформы (Write Once, Run Anywhere)
3. Инструменты отладки — только в JDK
# Список инструментов в JDK
jdb # Debugger
jstack # Анализ потоков
jmap # Анализ памяти
jcmd # Диагностика
jvisualvm # Графический монитор
jconsole # Мониторинг
# Эти инструменты в JRE отсутствуют
4. Стандартная библиотека
// Доступна и в JDK, и в JRE
import java.util.*; // Collections
import java.io.*; // I/O
import java.lang.String; // Basic types
import java.net.*; // Networking
// Но исходный код библиотеки (src.zip) только в JDK
Файловая структура
JDK структура
jdk-21/
├── bin/
│ ├── java ← JVM (запуск Java программ)
│ ├── javac ← Компилятор (только JDK)
│ ├── jar ← Утилита для работы с архивами
│ ├── jdb ← Debugger (только JDK)
│ ├── jstack ← Анализ памяти (только JDK)
│ └── ...
├── lib/
│ ├── modules ← Стандартная библиотека
│ └── ...
├── src.zip ← Исходный код (только JDK)
└── docs/ ← Документация (только JDK)
JRE структура (облегченная)
jre-21/
├── bin/
│ ├── java ← JVM (запуск Java программ)
│ └── ...
├── lib/
│ ├── modules ← Стандартная библиотека (ТОЛЬКО необходимое)
│ └── ...
Таблица сравнения
| Критерий | JVM | JDK |
|---|---|---|
| Назначение | Выполнение | Разработка |
| Компилятор (javac) | ✗ Нет | ✓ Есть |
| Инструменты отладки | ✗ Нет | ✓ Есть (jdb, jmap, ...) |
| java (запуск) | ✓ Есть | ✓ Есть |
| Стандартная библиотека | ✓ Есть | ✓ Есть |
| Исходный код | ✗ Нет | ✓ Есть (src.zip) |
| Документация | ✗ Нет | ✓ Есть |
| Размер | ~150 MB | ~300-500 MB |
| Для разработки | Недостаточно | Достаточно ✓ |
| Для запуска | Достаточно ✓ | Достаточно ✓ |
Практические сценарии
Разработка локально
# На компьютере разработчика должен быть JDK
java -version
# java version "21.0.1"
# javac -version
# javac 21.0.1
Production сервер
# На production сервере может быть только JRE
# (облегченная версия для запуска, без инструментов разработки)
java -version
# java version "21.0.1"
# javac — ✗ НЕ УСТАНОВЛЕН (не нужен на production)
Docker контейнер
# Для production используем облегченный образ с JRE
FROM openjdk:21-slim
COPY target/myapp.jar app.jar
CMD ["java", "-jar", "app.jar"]
# Для разработки можем использовать full JDK
FROM openjdk:21-sdk
RUN apt-get update && apt-get install -y maven
Как JVM достигает "Write Once, Run Anywhere"
Код на разных платформах:
Windows: Linux: macOS:
┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│ MyApp.java │ │ MyApp.java │ │ MyApp.java │
└────┬────────┘ └────┬────────┘ └────┬────────┘
↓ ↓ ↓
javac javac javac
↓ ↓ ↓
┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│ MyApp.class │ │ MyApp.class │ │ MyApp.class │
│ (bytecode) │ │ (bytecode) │ │ (bytecode) │
└────┬────────┘ └────┬────────┘ └────┬────────┘
↓ ↓ ↓
JVM for Windows JVM for Linux JVM for macOS
↓ ↓ ↓
Machine code Machine code Machine code
(x86) (x86 or ARM) (ARM)
Один файл .class работает везде потому что JVM переводит его в машинный код для конкретной платформы.
Итоги
- JVM — выполняет Java код (виртуальная машина)
- JDK — инструменты для разработки (содержит JVM + компилятор + утилиты)
- JVM в JDK — используется для локального запуска и тестирования
- JVM в JRE — облегченная версия, только для запуска
- На разработке — используй JDK (нужен javac компилятор)
- На production — можно использовать JRE (экономит место и память)
- Bytecode — промежуточный язык, который JVM переводит в машинный код
- WORA — "Write Once, Run Anywhere" работает благодаря JVM