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