Получить доступ

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

JuniorJIT и производительность
Ещё спрашивают так:
  • Почему Java-приложение медленное сразу после старта?
  • Как правильно измерять производительность Java-кода?
  • Что такое JMH?
Коротко

JIT компилирует часто выполняемые участки байткода в машинный код прямо во время работы программы.

  • Сначала интерпретация и сбор статистики, затем компиляция горячего кода с оптимизациями
  • Оптимизации опираются на реальное поведение: встраивание методов, escape analysis, удаление лишних проверок

А ещё Сразу после старта код медленнее — мерить нужно после прогрева, лучше через JMH

Так подсказку видит пользователь sotto на живом собеседовании — за пару секунд, пока вы думаете вслух.

Подробно

JVM начинает с интерпретации байткода и одновременно собирает статистику: какие методы вызываются чаще, какие ветки выполняются, какие типы реально приходят. Горячие участки компилируются в машинный код. В HotSpot это многоуровневая компиляция: сначала быстрый компилятор C1, затем оптимизирующий C2 для самого горячего кода.

Преимущество перед обычной заранее выполненной компиляцией — оптимизации основаны на реальном поведении программы:

  • встраивание (inlining) мелких методов;
  • escape analysis — объект, не покидающий метод, может не выделяться в куче;
  • удаление невыполняемых веток и лишних проверок;
  • оптимистичные предположения с откатом (деоптимизацией), если они перестали выполняться.

Практические следствия:

  • сразу после старта приложение медленнее — это прогрев;
  • наивные замеры через System.nanoTime() в цикле дают неверные цифры: прогрев, удаление «бесполезного» кода, сборка мусора. Для микробенчмарков используют JMH;
  • для быстрого старта есть кэш данных о классах и заранее скомпилированные образы (GraalVM Native Image).

Что хотят услышать

  • JIT компилирует горячий байткод во время выполнения.
  • Интерпретация, профилирование, компиляция.
  • Примеры оптимизаций.
  • Прогрев и правильные замеры (JMH).

Частые ошибки

  • Мерить скорость сразу после запуска приложения.
  • Путать компиляцию в байткод при сборке с компиляцией во время выполнения.

Проверьте себя

Один верный вариант. Подумайте, потом откройте ответ.

Показать варианты и ответ
  • ✓Компилирует часто выполняемые участки байткода в машинный код прямо во время работы программы
  • ✗Переводит исходный код в байткод при сборке проекта
  • ✗Оптимизирует размер файлов классов перед загрузкой
  • ✗Проверяет корректность типов при запуске приложения

Что спросят дальше

  • Почему для измерений используют специальный инструмент вместо ручных замеров?
  • Что такое деоптимизация и почему она возможна?

Разбор темы

Связанные вопросы

Закрытая бета

Подсказки на собеседовании — в реальном времени

sotto слышит вопрос интервьюера и показывает короткий ответ и план, как в блоке «Коротко». Оставьте контакт — пришлём доступ и промокод.

  • Промокод на 2 часа — сверх пробных 30 минут
  • Программа для Windows — скачать сразу, войти — через Яндекс ID или VK ID
  • Прямая связь с разработчиком: что улучшить — сделаем