Какие типы виртуальных машин существуют
Что проверяют
Различаете ли вы виртуальные машины процесса и системные и понимаете ли, где в этой картине JVM. Для Java-разработчика следом идёт вопрос про реализации JVM и про то, как она ведёт себя внутри контейнера.
Как отвечать
Сначала крупное деление:
- виртуальная машина процесса: исполняет байт-код одного приложения поверх ОС. JVM, CLR в .NET, BEAM в Erlang, V8 для JavaScript;
- системная виртуальная машина: эмулирует целый компьютер со своей ОС внутри. Гипервизоры первого типа работают прямо на железе (KVM, Hyper-V, Xen, ESXi), второго типа поверх хостовой ОС (VirtualBox).
Контейнеры в эту классификацию не входят: Docker изолирует процессы, но ядро у них общее с хостом.
Дальше про JVM подробнее. Это спецификация, и реализаций у неё несколько:
- HotSpot: основа OpenJDK и большинства сборок (Temurin, Corretto, Liberica). Интерпретатор плюс многоуровневая JIT-компиляция C1 и C2;
- OpenJ9: берут ради быстрого старта и меньшего потребления памяти;
- GraalVM: JIT-компилятор Graal и
native-image, который заранее собирает приложение в нативный бинарник с быстрым стартом, но с ограничениями на рефлексию.
Можно добавить про архитектуру: JVM стековая машина, а ART на Android исполняет регистровый DEX-байткод. Исходники на Java одни и те же, отличается цепочка компиляции.
Внутри контейнера JVM видит лимиты cgroup (UseContainerSupport включён по умолчанию с JDK 10), а размер кучи удобно задавать долей памяти через -XX:MaxRAMPercentage.
Где спотыкаются
Ставят Docker в один ряд с виртуальными машинами. Это изоляция на уровне ОС, отдельного ядра и эмуляции железа там нет.
Говорят, что JVM «интерпретирует байт-код». Горячий код компилируется JIT в машинный, поэтому после прогрева Java близка к нативной скорости.
Называют Dalvik текущей машиной Android. С Android 5.0 там ART, который сочетает AOT, JIT и профили.