Learn · concepts

Что такое JVM? Объяснение Java Virtual Machine

JVM выполняет байт-код Java на любой операционной системе. Именно поэтому Minecraft Java Edition и каждый мод Fabric работают одинаково на Windows, macOS и Linux.

TRtrolPublished 4 min read

Что такое JVM?

JVM, или Java Virtual Machine (Виртуальная машина Java), — это программа, которая выполняет код Java. Вы пишете на Java, компилятор преобразует его в байт-код, а JVM запускает этот байт-код на любой операционной системе. Именно поэтому Minecraft Java Edition и моды, созданные для неё, работают одинаково на Windows, macOS и Linux без перекомпиляции. JVM — это уровень абстракции, который делает принцип «напиши один раз, запускай где угодно» реальностью, а не просто маркетинговым слоганом.

Что на самом деле делает JVM

JVM выполняет байткод, а не исходный код. Когда вы компилируете программу на Java, вы не получаете исполняемый файл для Windows или Mac. Вы получаете файлы классов, полные байткода — компактного набора инструкций, который понимает JVM. JVM считывает эти инструкции и выполняет их на вашем компьютере.

Именно этот дополнительный слой и является сутью. Один и тот же байткод работает везде, где есть JVM, поэтому "напиши один раз, запускай где угодно" — это краткое объяснение того, почему Java распространилась настолько широко. JVM — это та часть, которая делает это обещание реальным. JAR-файл модов Fabric работает одинаково, независимо от того, играет ли пользователь на Windows, macOS или Linux, потому что они все запускают один и тот же байткод через одну и ту же JVM, а JVM обрабатывает различия в оборудовании.

JVM, JRE и JDK

Эти три термина часто путают, поэтому вот разделение.

ТерминЧто это такоеКогда это нужно
JVMДвижок, который выполняет байткодВсегда, для запуска любой Java-программы
JREJVM плюс стандартные библиотекиДля запуска Java-программ
JDKJRE плюс компилятор и инструменты разработкиДля создания Java-программ

Игроку нужна только среда выполнения для запуска игры. Разработчику, создающему мод, нужен полный JDK, чтобы сначала скомпилировать Java в байткод.

Как JVM быстро выполняет ваш код

JVM начинает с интерпретации байт-кода по одной инструкции за раз. В процессе работы он отслеживает, какие методы вызываются чаще всего. Эти «горячие» участки кода передаются JIT-компилятору, который преобразует их в машинный код в реальном времени. После прогрева наиболее загруженный код работает почти с той же скоростью, что и машинный. Именно поэтому Minecraft ощущается с задержкой в первые несколько секунд, а затем стабилизируется: JIT-компилятор работает в фоновом режиме.

JVM также управляет памятью за вас. Сборщик мусора освобождает объекты, которые вы больше не используете, поэтому вам не нужно освобождать память вручную, как это делается в C. Это одна из причин, по которой Java проста в написании и является распространенным первым языком для моддеров. Управление памятью встроено.

Почему это важно для Minecraft

Minecraft Java Edition работает на JVM, а также все утилиты-клиенты и моды, предназначенные для нее. Собственный код клиента может быть написан на Java, Kotlin или другом языке JVM, поскольку они все компилируются в один и тот же байт-код, который выполняет JVM. Мод Fabric поставляется в виде jar-файла с байт-кодом, загрузчик подключает его к игре при запуске, и JVM выполняет все это как один процесс.

Именно поэтому лаунчеры позволяют настраивать такие параметры, как размер кучи и версия Java. Вы настраиваете JVM, на котором работает игра, а не саму игру. Предоставление JVM большего объема памяти означает, что у Minecraft больше пространства для работы. Выбор более новой версии Java может дать прирост скорости, поскольку более новые JVM часто лучше оптимизируют часто используемые участки кода.

FAQ