Найти в Дзене
Записки о Java

Виды виртуальных машин Java и их эволюция: от классики до современности

Цель статьи: Понять, что такое JVM, какие её реализации существуют, как они менялись с течением времени и почему это важно для Java-разработчика. Java Virtual Machine (JVM) — это виртуальная машина, которая исполняет байт-код Java. Именно благодаря JVM Java может быть «написана один раз — запущена где угодно» (Write Once, Run Anywhere). Когда вы компилируете .java файл с помощью javac, получается .class файл с байт-кодом. Этот байт-код не зависит от операционной системы, но он требует JVM, чтобы превратиться в машинные инструкции, понятные процессору. Существует не одна, а несколько реализаций JVM. Вот самые известные: 💡 Интересный факт: HotSpot получил своё название потому, что JIT-компилятор фокусируется на «горячих» участках кода — тех, которые выполняются чаще всего. 📌 Практический пример: Если вы запускаете Spring Boot-приложение в Docker-контейнере с ограничением памяти в 256 МБ, OpenJ9 может оказаться предпочтительнее HotSpot. 🧪 Пример использования: # Компилируем Java-прило
Оглавление
Рисунок: виды виртуальных машин в JAVA
Рисунок: виды виртуальных машин в JAVA

Цель статьи: Понять, что такое JVM, какие её реализации существуют, как они менялись с течением времени и почему это важно для Java-разработчика.

Что такое JVM?

Java Virtual Machine (JVM) — это виртуальная машина, которая исполняет байт-код Java. Именно благодаря JVM Java может быть «написана один раз — запущена где угодно» (Write Once, Run Anywhere).

Когда вы компилируете .java файл с помощью javac, получается .class файл с байт-кодом. Этот байт-код не зависит от операционной системы, но он требует JVM, чтобы превратиться в машинные инструкции, понятные процессору.

Основные реализации JVM

Существует не одна, а несколько реализаций JVM. Вот самые известные:

1. HotSpot (Oracle/OpenJDK)самая популярная

  • Разработана компанией Sun Microsystems, сейчас поддерживается Oracle и OpenJDK.
  • Используется по умолчанию в большинстве дистрибутивов OpenJDK и Oracle JDK.
  • Поддерживает JIT-компиляцию (Just-In-Time), адаптивную оптимизацию, сборку мусора и многое другое.
  • Эволюционировала от простого интерпретатора до сложной системы с C1 (client compiler) и C2 (server compiler).
💡 Интересный факт: HotSpot получил своё название потому, что JIT-компилятор фокусируется на «горячих» участках кода — тех, которые выполняются чаще всего.

2. OpenJ9 (Eclipse Foundation)альтернатива от IBM

  • Первоначально разрабатывалась IBM как J9, позже передана Eclipse Foundation.
  • Известна своей низкой потребляемой памятью и быстрым запуском.
  • Особенно популярна в облачных средах и микросервисах.
  • Поддерживает те же стандарты Java, что и HotSpot, но имеет другую архитектуру сборщика мусора и JIT-компилятора.
📌 Практический пример: Если вы запускаете Spring Boot-приложение в Docker-контейнере с ограничением памяти в 256 МБ, OpenJ9 может оказаться предпочтительнее HotSpot.

3. GraalVMмногоязычная и нативная

  • Разработана Oracle как универсальная виртуальная машина.
  • Поддерживает не только Java, но и JavaScript, Python, Ruby, R и другие языки.
  • Включает Graal Compiler — высокопроизводительный JIT-компилятор.
  • Имеет режим Native Image, позволяющий компилировать Java-приложения в нативные исполняемые файлы без JVM.
🧪 Пример использования:

# Компилируем Java-приложение в нативный бинарник

native-image -jar myapp.jar

./myapp # запускается мгновенно, без JVM!

⚠️ Важно: Native Image не поддерживает всю динамику Java (например, рефлексию без явного конфигурирования), но отлично подходит для микросервисов и CLI-утилит.

4. Microsoft Build of OpenJDK

  • Это не новая JVM, а дистрибутив OpenJDK с HotSpot, собранный и поддерживаемый Microsoft.
  • Оптимизирован для Azure и Windows.
  • Полностью совместим с другими OpenJDK-реализациями.

Эволюция JVM по версиям Java

Хотя сама JVM — это отдельный компонент, её возможности тесно связаны с версией Java (JDK). Рассмотрим ключевые изменения:

Java 1.0–1.1

Простой интерпретатор, без JIT. Медленно.

Java 1.2 (1998)

Появление HotSpot и JIT-компиляции.

Java 5 (2004)

ВведениеG1 GC(в экспериментальном режиме), улучшения в многопоточности.

Java 7

Поддержка invokedynamic— основа для динамических языков на JVM.

Java 8

Улучшения в сборке мусора, появление Metaspace вместо PermGen.

Java 9+

Модульная система (JPMS), улучшения в JIT, новые GC (ZGC, Shenandoah).

Java 11

ПоддержкаEpsilon GC(no-op GC для тестов), улучшения в AOT-компиляции.

Java 17 (LTS)

ZGC и Shenandoah GC стали production-ready — паузы <1 мс даже на терабайтах кучи.

Java 21 (LTS)

Введение Virtual Threads(Project Loom) — революция в concurrency, но требует поддержки со стороны JVM.

🔍 Пример: как GC менялся со временем

// В Java 7 и раньше: PermGen (часто OutOfMemoryError)

// В Java 8+: Metaspace (растёт динамически в нативной памяти)

Как выбрать подходящую JVM?

Обычное корпоративное приложение

HotSpot (OpenJDK)

Ограниченная память / облако

OpenJ9

Нужен быстрый старт и низкое потребление памяти

GraalVM Native Image

Многоязычная среда

GraalVM

Максимальная производительность на сервере

HotSpot с ZGC/Shenandoah

Заключение

JVM — это не просто «коробка», в которую вы кладёте байт-код. Это сложная, живая система, которая эволюционировала десятилетиями. Понимание различий между реализациями JVM и их возможностями помогает:

  • Писать более эффективный код.
  • Выбирать правильную среду выполнения.
  • Диагностировать проблемы с памятью и производительностью.