Что такое JIT компиляция в Java?

Каждый язык программирования использует компилятор для преобразования кода языка высокого уровня в двоичный код машинного уровня, поскольку система понимает только двоичный код. В зависимости от типа языка программирования он отличается, в Java также есть свой компилятор.

Понятие JIT компилятора

JIT Compiler в Java — это одна из составных частей Java Runtime Environment. Он в основном отвечает за оптимизацию производительности приложений во время выполнения. В общем, главный девиз компилятора — повышение производительности приложения для конечного пользователя и разработчика приложения.

Нюансы

  • Байт-код — это главный потенциал Java-среды WORA (пиши один раз, беги куда угодно). Скорость приложения зависит от способа преобразования байтового кода в машинный код. Байт-код может быть либо интерпретирован, либо скомпилирован в собственный код, либо непосредственно выполнен на процессоре. Но, если он интерпретируется, это напрямую влияет на скорость приложения.
  • Для повышения производительности, JIT-компилятор связывается с JVM во время выполнения, чтобы скомпилировать последовательности байт-кода в собственный машинный код. По сути, при использовании JIT Compiler нативный код легко исполняется аппаратными средствами по сравнению с JVM Interpreter. Таким образом, скорость выполнения будет значительно увеличена.
  • Когда JIT-компилятор компилирует последовательность байтового кода, он также выполняет определенную оптимизацию, такие как анализ данных, перевод из стековых операций в операции регистрации, устранение подвыражений и т. д. Это делает Java очень эффективной, когда речь идет о выполнении и производительности.

Принцип работы

JIT или динамический компилятор ускоряет производительность приложений во время выполнения. Поскольку Java программа состоит из классов и объектов. По сути, представляет собой байт-код, который не зависит от платформы и выполняется JVM в различных архитектурах.

Рабочий процесс:

На диаграмме ниже показано, как происходит фактическая компиляция в среде выполнения Java.

JIT компиляция схема

Когда вы кодируете Java-программу, JRE использует компилятор javac для компиляции исходного кода высокого уровня в байт-код. После этого JVM загружает байт-код во время выполнения и преобразует его в двоичный код машинного уровня для дальнейшего выполнения с использованием Interpreter.

Интерпретация байтового кода Java снижает производительность по сравнению с нативным приложением. Именно здесь JIT-компилятор помогает повысить производительность, компилируя байт-код в машинный код «точно в срок» для запуска.

JIT-компилятор активируется и включается по умолчанию, когда метод вызывается. Когда метод компилируется, виртуальная машина вызывает скомпилированный код метода напрямую, не интерпретируя его. Следовательно, не требует большого использования памяти и процессорного времени. Это в основном ускоряет производительность приложения.

Аспекты безопасности

Компиляция байтового кода в машинный код JIT-компилятором осуществляется непосредственно в памяти. т.е. компилятор передает машинный код непосредственно в память и выполняет его. В этом случае он не сохраняет машинный код на диске перед вызовом файла класса и его выполнением.

По сути, память должна быть помечена как исполняемая. В целях безопасности это должно быть выполнено после записи кода в память. Он также должен быть помечен как доступный только для чтения, поскольку исполняемая память является дырой в безопасности.

Плюсы и минусы JIT в Java

Плюсы:

  • Код Java, который вы написали много лет назад, будет работать быстрее даже сегодня, что повышает производительность программ Java.
  • Собственные образы также выполняются быстрее, так как они не имеют начальных действий и требуют меньше памяти.

Минусы:

  • Увеличивает сложность программ Java.
  • Программы с меньшим количеством кода не получают преимущества при использовании Just-In-Time компиляции.
Оцените статью