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