Короткий ответ
JVM — виртуальная машина Java, которая исполняет байт-код и обеспечивает переносимость программ. JRE — среда выполнения: JVM плюс стандартные библиотеки, нужна только для запуска приложений. JDK — комплект разработчика: всё из JRE плюс компилятор javac, утилиты и отладчик. Отношение вложенности: JDK содержит JRE, JRE содержит JVM.
Как это работает подробнее
Компоненты различаются составом и назначением, но работают вместе: вы пишете код, инструменты JDK превращают его в байт-код, а JVM внутри JRE исполняет этот байт-код на конкретной платформе.
- JVM. Загружает и проверяет class-файлы, интерпретирует инструкции байт-кода, а горячие участки компилирует JIT-компилятором в машинный код. Существует отдельная реализация под каждую платформу: Windows, Linux, macOS.
- JRE. Содержит
JVMи стандартные библиотеки классов (java.lang,java.utilи другие). Достаточна пользователю, который только запускает готовое приложение. - JDK. Нужен разработчику: включает компилятор
javac, утилитыjava,jar,javadocи отладчик.
Пример кода
Компиляция и запуск программы
# шаг 1: компиляция исходника в байт-код — нужен javac из JDK
javac HelloWorld.java
# шаг 2: запуск — байт-код исполняет JVM, входящая в JRE
java HelloWorldЧто использовать на практике
- Разработчику устанавливать полный
JDK— только там естьjavacи инструменты сборки. - Для запуска готового приложения пользователю достаточно
JRE. - Помнить про вложенность: возможности
JREиJVMвсегда включены вJDK.