Что такое JVM
Что проверяют
Интервьюер ждёт не «виртуальная машина для запуска Java», а устройство: загрузка классов, память, JIT, сборка мусора, и различие JVM, JRE и JDK. Следом обычно уходят в одну из веток: области памяти, работа JIT или поведение JVM в контейнере.
Как отвечать
JVM выполняет байт-код из .class-файлов. Это спецификация, и реализаций у неё несколько: HotSpot (внутри OpenJDK и сборок на его основе: Temurin, Corretto, Liberica, Oracle JDK), OpenJ9, GraalVM. На JVM работают не только Java, но и Kotlin, Scala, Groovy.
Дальше по частям:
- загрузка классов: загрузчики Bootstrap, Platform (с Java 9 вместо Extension) и Application, делегирование родителю. Класс грузится лениво, затем верифицируется, связывается и инициализируется (
static-блоки); - области памяти: куча для объектов, стек у каждого потока для фреймов и локальных переменных, Metaspace для метаданных классов (с Java 8 вместо PermGen, вне кучи), code cache для скомпилированного кода;
- исполнение: сначала интерпретатор, затем JIT. В HotSpot многоуровневая компиляция: C1 компилирует быстро, C2 агрессивно оптимизирует горячие методы по собранному профилю, а при нарушении допущений происходит деоптимизация;
- сборка мусора: по умолчанию G1 (с Java 9), для малых пауз ZGC (с Java 24 только в генерационном режиме) и Shenandoah.
Разницу терминов назовите явно: JDK это JVM, стандартная библиотека и инструменты разработки (javac, jcmd, jfr). Отдельный JRE Oracle не выпускает с Java 11, минимальную среду под приложение собирают через jlink. Актуальные LTS на 2026 год: 21 и 25.
Где спотыкаются
Говорят, что Java интерпретируемый язык. Горячий код после JIT выполняется как нативный, и именно поэтому замеры без прогрева врут; для микробенчмарков есть JMH.
Считают кроссплатформенность бесплатной. Байт-код переносим, а сама JVM у каждой платформы своя, и нативный код через JNI переносимость ломает.
Не знают, как JVM ведёт себя в контейнере. По умолчанию максимальная куча это четверть лимита памяти (-XX:MaxRAMPercentage=25), а при одном доступном процессоре или меньше чем примерно 1,8 ГБ памяти JVM выбирает Serial GC вместо G1.