Что такое JIT-компилятор в контексте JVM?

«Что такое JIT-компилятор в контексте JVM?» — вопрос из категории Java Core, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

JIT (Just-In-Time) компилятор — это компонент виртуальной машины Java (JVM), который динамически компилирует байт-код в оптимизированный машинный код во время выполнения программы.

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

  1. Изначально JVM интерпретирует байт-код.
  2. Система профилирования (Profiler) идентифицирует «горячие» методы — участки кода, выполняемые часто.
  3. JIT-компилятор транслирует эти методы в нативный машинный код, применяя агрессивные оптимизации.
  4. При последующих вызовах выполняется уже скомпилированный быстрый код.

Пример оптимизации (развертывание цикла — loop unrolling):

// Байт-код этого цикла может быть JIT-скомпилирован
// в более эффективную последовательность инструкций.
for (int i = 0; i < 1000; i++) {
    total += i;
}

Ключевые преимущества:

  • Производительность: Скомпилированный код выполняется на порядок быстрее интерпретируемого.
  • Адаптивные оптимизации: JIT может применять оптимизации, невозможные при статической (AOT) компиляции, например:
    • Inlining: Подстановка тела небольших методов.
    • Escape Analysis: Определение, может ли объект «убежать» из метода, и последующая аллокация на стеке.
    • Удаление мертвого кода.
  • Платформенная специфичность: Генерируется код, оптимальный для конкретного процессора и ОС, на которой запущена JVM.

JIT-компиляторы в HotSpot JVM: C1 («клиентский», быстрая компиляция), C2 («серверный», глубокие оптимизации), и современный GraalVM.