Структура JDK

JDK — комплект для разработки и запуска Java-программ. Он содержит runtime, стандартные модули и инструменты: компилятор, упаковщик, диагностические утилиты и генератор документации.

От исходника до выполнения

Main.java --javac--> Main.class --java--> JVM
                                      ├─ загрузка классов
                                      ├─ проверка байт-кода
                                      ├─ интерпретация
                                      └─ JIT-компиляция горячего кода

javac — статический компилятор исходного кода в байт-код. Он не является JIT. JIT входит в реализацию JVM и во время работы превращает часто исполняемый байт-код в машинный код конкретного процессора.

JDK, runtime и JVM

  • JVM задаёт машину исполнения байт-кода: инструкции, память, загрузку классов и правила выполнения.
  • Runtime image содержит JVM и модули, необходимые для запуска.
  • JDK добавляет инструменты разработки к runtime.

Начиная с Java 11 Oracle и большинство поставщиков не распространяют отдельный универсальный JRE как обязательную часть установки. Нужный runtime можно собрать jlink, поэтому схема «JDK всегда включает отдельную папку JRE» относится прежде всего к старым дистрибутивам.

Основные инструменты

КомандаНазначение
javacкомпиляция .java в .class
javaзапуск main-класса, модуля или jar
jarсоздание и просмотр JAR
javadocдокументация из исходников
jdepsанализ зависимостей
jlinkсборка компактного runtime image
jcmd, jstack, jmapдиагностика работающей JVM

Модули и библиотеки

С Java 9 платформа разделена на именованные модули. Базовый модуль java.base доступен всегда; остальные подключаются по зависимостям. Classpath остаётся поддерживаемым, но не даёт такой же строгой границы доступа, как module path.

Загрузка классов подробнее разобрана в Class loader, память — в Стек и куча в Java, оптимизация исполнения — часть О языке Java.

Вопросы для собеседования

  1. Чем javac отличается от JIT? Первый компилирует исходник заранее в байт-код, второй во время запуска компилирует горячий байт-код в машинный.
  2. Что именно кроссплатформенно? Формат байт-кода и API платформы; JVM поставляется отдельно под каждую ОС и архитектуру.
  3. Зачем jlink? Чтобы собрать runtime только из нужных модулей.
  4. Где находится сборщик мусора? В реализации JVM, а не в компиляторе.
  5. Что лежит в .class? Байт-код, таблица констант и метаданные класса.
  6. Можно ли запустить Java без полного JDK? Да, если есть подходящий runtime image со всеми нужными модулями.