JIT-компиляция и многоуровневая компиляция
Узнайте, как JVM интерпретирует, а затем JIT-компилирует часто используемые методы, и как запускать и наблюдать компиляцию.
«JIT-компиляция и многоуровневая компиляция» — бесплатный урок Java Academy на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Java Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Java Academy содержит 4 уроков всего.
Интерпретатор и JIT
Изначально JVM интерпретирует байт-код. Когда метод вызывается часто («становится горячим»), JIT-компилятор компилирует его в машинный код для значительно более быстрого выполнения.
Многоуровневая компиляция (по умолчанию начиная с Java 8)
Многоуровневая компиляция использует пять уровней: T0 (интерпретатор), T1 (простой C1), T2 (C1 с ограниченным профилированием), T3 (C1 с полным профилированием), T4 (полностью оптимизированный C2). По мере того как методы становятся горячее, они переходят на более высокие уровни.
// Enable/disable tiered compilation:
// -XX:+TieredCompilation (default ON in Java 8+)
// -XX:-TieredCompilation (disables — only C2 used)Компилятор C1 (клиентский компилятор)
C1 компилирует быстро, применяя умеренную оптимизацию. Он добавляет инструментирование для профилирования, чтобы измерять частоту вызовов и результаты переходов, необходимые C2.
Компилятор C2 (серверный компилятор)
C2 (Opto) выполняет глубокую оптимизацию: встраивание, анализ выхода за пределы, разворачивание циклов, векторизацию и удаление мёртвого кода. Он создаёт самый быстрый машинный код, но компилирует дольше.
// Force server JIT only:
java -server MyApp
// Or explicitly:
java -XX:-TieredCompilation MyApp // uses C2 only (warm-up is slower)Порог компиляции
Метод компилируется JIT после превышения порога счётчика вызовов. По умолчанию: 10 000 вызовов (C2). Настройте его с помощью -XX:CompileThreshold=N.
// Lower threshold for faster warm-up (at cost of less optimization):
java -XX:CompileThreshold=1000 MyAppВстраивание
Встраивание — наиболее эффективная оптимизация C2: небольшие методы, вызываемые из горячего кода, «вставляются» в место вызова, что устраняет накладные расходы на диспетчеризацию методов и открывает возможности для дальнейших оптимизаций.
// Check inlining decisions:
java -XX:+PrintInlining -XX:+UnlockDiagnosticVMOptions MyApp
// Output:
// @ 5 com.example.User::getName (5 bytes) inlinedАнализ выхода за пределы
Если C2 определяет, что объект никогда не покидает текущий метод (или поток), он может разместить его в стеке вместо кучи — полностью устранив нагрузку на GC.
// Objects that don't escape are stack-allocated:
String result = new StringBuilder().append("Hello ").append(name).toString();
// The StringBuilder may be eliminated by escape analysisЖурналы компиляции JIT
Используйте -XX:+PrintCompilation, чтобы записывать каждый метод в момент его компиляции. В выводе отображаются имя метода, уровень и флаги компиляции.
// java -XX:+PrintCompilation MyApp
// Output:
// 1 n java.lang.String::hashCode (0 bytes)
// 25 3 com.example.UserService::findById (42 bytes)
// 31 4 com.example.UserService::findById (42 bytes) made not entrantДеоптимизация
Если предположение JIT нарушается (например, загружается класс, изменяющий тип получателя в месте вызова), C2 выполняет «деоптимизацию» — возвращается к интерпретатору или C1. Это нормально и обычно прозрачно.
Время прогрева
Компиляция JIT занимает время. В короткоживущих процессах методы могут так и не быть скомпилированы JIT. Используйте компиляцию заранее (GraalVM Native Image) или кэшируйте результаты JIT с помощью разделения данных классов (CDS) для более быстрого запуска.
// Enable AppCDS to cache JIT-compilable classes:
java -XX:ArchiveClassesAtExit=app.jsa -cp app.jar MyApp # generate archive
java -XX:SharedArchiveFile=app.jsa -cp app.jar MyApp # use archiveJIT GraalVM
GraalVM заменяет C2 компилятором JIT, написанным на Java. Это обеспечивает более эффективные оптимизации, возможность использовать JIT для языков, отличных от Java, и служит основой для Native Image (компиляции заранее).
Быстрая проверка
Как называется техника компиляции JIT, устраняющая накладные расходы на вызов метода за счёт встраивания небольших методов в вызывающий код?
Итоги
Многоуровневая компиляция переводит методы с C1 (быстрая компиляция и профилирование) на C2 (глубокая оптимизация). Ключевые оптимизации: встраивание, анализ выхода за пределы, разворачивание циклов. Используйте -XX:+PrintCompilation, чтобы наблюдать за решениями JIT. Выполняйте прогрев перед измерением производительности.
Часто задаваемые вопросы
Урок «JIT-компиляция и многоуровневая компиляция» бесплатный?
Да — полный текст урока «JIT-компиляция и многоуровневая компиляция» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Java Academy, подпишись на CoddyKit PRO. Курс Java Academy содержит 4 уроков всего.
Чему я научусь в уроке «JIT-компиляция и многоуровневая компиляция»?
Узнайте, как JVM интерпретирует, а затем JIT-компилирует часто используемые методы, и как запускать и наблюдать компиляцию. Ты практикуешь Java Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Java Academy?
Предыдущий опыт не требуется. Java Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.
Сколько времени занимает урок «JIT-компиляция и многоуровневая компиляция»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Java Academy?
Да. Каждый урок Java Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Этапы загрузки классов: загрузка, связывание, инициализация
- Иерархия ClassLoader и пользовательские загрузчики
- Просмотр байткода с помощью javap
- JIT-компиляция и многоуровневая компиляция