0Pricing
Java Academy · Урок

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 archive

JIT 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 — локальная установка не требуется.

Все уроки этого курса

  1. Этапы загрузки классов: загрузка, связывание, инициализация
  2. Иерархия ClassLoader и пользовательские загрузчики
  3. Просмотр байткода с помощью javap
  4. JIT-компиляция и многоуровневая компиляция
← Назад к Java Academy