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

Что верно про JIT-компиляцию в HotSpot?

MiddleJIT и производительность
Коротко

Код сначала интерпретируется, горячие методы компилирует C1 (быстро, с профилированием), затем C2 (агрессивные оптимизации по профилю). Оптимизации спекулятивны: встраивание по наблюдавшемуся типу, удаление невыполнявшихся веток. Предположение нарушилось — деоптимизация и возврат в интерпретатор.

  • Отсюда необходимость прогрева перед замерами и после деплоя
  • Встраивание (inlining) — главная оптимизация, открывающая остальные
  • Ускорить старт: CDS, AOT-кэш (Project Leyden), GraalVM Native Image

А ещё JIT знает реальный профиль — преимущество перед статической компиляцией

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

Подробно

JIT опирается на профиль реального выполнения, и в этом его преимущество перед статической компиляцией: он видит, какая ветка берётся чаще и какой конкретный тип приходит в вызов. На этом строятся спекулятивные оптимизации — встраивание виртуального вызова по фактически наблюдавшемуся типу, устранение проверок, удаление недостижимых ветвей. Поскольку предположение может нарушиться (загрузился новый класс, ветка наконец сработала), в код вставляются проверки, а при их срабатывании происходит деоптимизация и возврат к интерпретации. Практический вывод — измерять производительность можно только после прогрева, и именно поэтому самодельные бенчмарки на System.nanoTime обычно врут, а пользоваться следует JMH.

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

  • Уровни компиляции.
  • Спекулятивные оптимизации и деоптимизация.
  • Следствие для прогрева.

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

  • Мерить производительность на холодной JVM.
  • Считать скомпилированный код окончательным.

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

Несколько верных вариантов. Подумайте, потом откройте ответ.

Показать варианты и ответ
  • ✓Код сначала интерпретируется, а горячие участки компилируются — отсюда необходимость прогрева перед измерениями
  • ✓Tiered compilation сочетает быстрый компилятор C1 и оптимизирующий C2
  • ✓JIT может выполнить спекулятивную оптимизацию и деоптимизировать код, если предположение нарушилось
  • ✗После компиляции метода машинный код больше никогда не меняется

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

  • Что такое escape analysis и когда объект не попадает в кучу?
  • Какие ошибки чаще всего убивают самодельные микробенчмарки?

Разбор темы

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

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

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

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

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