Learn · concepts
Что такое JVM? Объяснение Java Virtual Machine
JVM выполняет байт-код Java на любой операционной системе. Именно поэтому Minecraft Java Edition и каждый мод Fabric работают одинаково на Windows, macOS и Linux.
Что такое 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-программы |
| JRE | JVM плюс стандартные библиотеки | Для запуска Java-программ |
| JDK | JRE плюс компилятор и инструменты разработки | Для создания 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
Нет. Java — это язык; JVM — это среда выполнения, которая исполняет скомпилированный вывод. Другие языки, такие как Kotlin, также компилируются в байт-код и работают на той же JVM.
Вам нужна Java runtime, которая включает в себя JVM. Многие лаунчеры поставляются с предустановленной, поэтому, возможно, она у вас уже есть, и вам не потребуется устанавливать её отдельно.
JVM выполняет байткод. JDK — это полный комплект разработчика, включающий компилятор и инструменты, которые вы используете для создания Java-программ в первую очередь.
Сначала оно интерпретирует байт-код, а затем JIT-компилятор преобразует наиболее часто используемый код в машинный код во время выполнения программы. Этот разогрев — затраты на запуск; ускорение происходит позже.