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

В чем разница между 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    ← Стандартная библиотека (ТОЛЬКО необходимое)
│   └── ...

Таблица сравнения

КритерийJVMJDK
НазначениеВыполнениеРазработка
Компилятор (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 переводит его в машинный код для конкретной платформы.

Итоги

  1. JVM — выполняет Java код (виртуальная машина)
  2. JDK — инструменты для разработки (содержит JVM + компилятор + утилиты)
  3. JVM в JDK — используется для локального запуска и тестирования
  4. JVM в JRE — облегченная версия, только для запуска
  5. На разработке — используй JDK (нужен javac компилятор)
  6. На production — можно использовать JRE (экономит место и память)
  7. Bytecode — промежуточный язык, который JVM переводит в машинный код
  8. WORA — "Write Once, Run Anywhere" работает благодаря JVM
В чем разница между JVM и JDK? | PrepBro