Что верно про JIT-компиляцию в HotSpot?
Код сначала интерпретируется, горячие методы компилирует C1 (быстро, с профилированием), затем C2 (агрессивные оптимизации по профилю). Оптимизации спекулятивны: встраивание по наблюдавшемуся типу, удаление невыполнявшихся веток. Предположение нарушилось — деоптимизация и возврат в интерпретатор.
- Отсюда необходимость прогрева перед замерами и после деплоя
- Встраивание (inlining) — главная оптимизация, открывающая остальные
- Ускорить старт: CDS, AOT-кэш (Project Leyden), GraalVM Native Image
А ещё JIT знает реальный профиль — преимущество перед статической компиляцией
Подробно
JIT опирается на профиль реального выполнения, и в этом его преимущество перед статической компиляцией: он видит, какая ветка берётся чаще и какой конкретный тип приходит в вызов. На этом строятся спекулятивные оптимизации — встраивание виртуального вызова по фактически наблюдавшемуся типу, устранение проверок, удаление недостижимых ветвей. Поскольку предположение может нарушиться (загрузился новый класс, ветка наконец сработала), в код вставляются проверки, а при их срабатывании происходит деоптимизация и возврат к интерпретации. Практический вывод — измерять производительность можно только после прогрева, и именно поэтому самодельные бенчмарки на System.nanoTime обычно врут, а пользоваться следует JMH.
Что хотят услышать
- Уровни компиляции.
- Спекулятивные оптимизации и деоптимизация.
- Следствие для прогрева.
Частые ошибки
- Мерить производительность на холодной JVM.
- Считать скомпилированный код окончательным.
Проверьте себя
Несколько верных вариантов. Подумайте, потом откройте ответ.
Показать варианты и ответ
- ✓Сначала код интерпретируется, горячие участки компилируются — нужен прогрев
- ✓Tiered compilation сочетает быстрый C1 и оптимизирующий C2
- ✓JIT может спекулятивно оптимизировать код и деоптимизировать его
- ✗После компиляции метода машинный код больше никогда не меняется и не возвращается к интерпретатору
Что спросят дальше
- Что такое escape analysis и когда объект не попадает в кучу?
- Какие ошибки чаще всего убивают самодельные микробенчмарки?
Разбор темы
- JIT, оптимизации и бенчмаркинг
Tiered compilation C1/C2, ключевые оптимизации JIT (inlining, escape analysis), деоптимизация и прогрев, корректные микробенчмарки на JMH.
Связанные вопросы
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.