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

Ответ

Это три взаимосвязанных, но различных компонента Java-платформы:

  1. JVM (Java Virtual Machine)виртуальная машина. Это исполняемая среда, которая выполняет байт-код Java (.class файлы). Ее основные задачи:

    • Загрузка классов.
    • Верификация байт-кода.
    • Выполнение кода (интерпретация или JIT-компиляция).
    • Управление памятью (сборка мусора).
    • JVM — это то, что непосредственно запускает Java-программу.
  2. JRE (Java Runtime Environment)среда выполнения. Это набор для запуска Java-приложений. Включает:

    • JVM.
    • Библиотеки классов Java (Java Class Library, например, java.lang, java.util).
    • Другие вспомогательные файлы.
    • JRE = JVM + Библиотеки. Ее достаточно, чтобы запускать скомпилированные программы.
  3. JDK (Java Development Kit)комплект разработчика. Это набор для разработки Java-приложений. Включает:

    • JRE (а значит, и JVM).
    • Компилятор (javac).
    • Инструменты для разработки и отладки (javadoc, jdb, jar и др.).
    • JDK = JRE + Инструменты разработки. Необходим для написания и компиляции кода.

Итог:

  • Разработчик устанавливает JDK.
  • Пользователь, которому нужно только запустить приложение, устанавливает JRE.
  • JVM — это ядро, работающее внутри JRE.

Ответ 18+ 🔞

Так, слушай, а то тут народ путается в этих трёх буквах, как слепой кот в сортире. JVM, JRE, JDK — звучит, будто аббревиатуры из какого-то секретного протокола, а на деле всё просто, блядь.

Представь, что ты пишешь код. Ты — разработчик, царь и бог. Тебе нужен JDK (Java Development Kit). Это, сука, такой чемоданчик с отвёртками, паяльником и ядерной бомбой. В нём есть ВСЁ: и компилятор javac, который твой код в байт-код превращает, и отладчик, и документатор, и, что самое главное, JRE внутри уже сидит. Без JDK ты нихуя не скомпилируешь. Это твой рабочий верстак, заваленный пивными банками и проводами.

А теперь, допустим, ты написал программу — SuperPuperApp.jar. И хочешь её другу-васе отдать, который в программировании нихуя не шарит. Ему что нужно? Ему не нужно паять и компилировать, ему нужно только запустить твой шедевр. Вот для этого ему хватит JRE (Java Runtime Environment). Это такая урезанная версия — уже без компилятора и прочих инженерных прибамбасов. В JRE лежит JVM и куча готовых библиотек (java.lang, java.util — ну, те самые кирпичики, из которых всё строится). JRE — это как установленный на компе видеоплеер. Тебе же не нужен весь завод по производству фильмов, чтобы кино посмотреть? Вот и тут так же.

Ну и наконец, святая святых — JVM (Java Virtual Machine). Это, блядь, движок внутри JRE, её пылающее сердце. Её задача — взять этот самый байт-код (файлы .class) и выполнить его. Она их загружает, проверяет (чтоб ты там какую-нибудь дичь не подсунул), памятью управляет (собирает мусор, проще говоря), и либо интерпретирует, либо на лету компилирует в машинный код. JVM — это и есть та самая «виртуальная машина», которая делает Java кроссплатформенной. Она — исполнитель, дирижёр этого всего оркестра.

Короче, схема проще пареной репы:

  • Хочешь писать и собирать программы? Бери JDK. В нём уже есть JRE, а в JRE — JVM. Полный фарш.
  • Хочешь только запускать готовые программы? Хватит и JRE. В ней уже сидит JVM.
  • А JVM — это ядро, которое прямо вот крутит твой код. Без неё — пиздец и темнота.

Вот и вся магия, ёпта. Не такой уж и тёмный лес, как кажется. Главное — не пытайся компилировать что-то с помощью JRE, а то получишь ошибку, от которой волосы завьются.