Вопрос с собеседования · Java

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

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

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

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

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

Подробно

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

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

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

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

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

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

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

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

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

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

Разбор темы

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

Партнёр платформы

Разбор собеседования с sotto

После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.

Разбор собеседования