Как JVM оптимизирует метод, вызываемый тысячи раз?

«Как JVM оптимизирует метод, вызываемый тысячи раз?» — вопрос из категории Java Core, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

JVM использует JIT-компиляцию (Just-In-Time) для оптимизации «горячих» методов. После множества вызовов (пороговое значение ~10 000, но зависит от JVM) байт-код компилируется в нативный машинный код, что значительно ускоряет выполнение.

Процесс оптимизации:

  1. Интерпретация: Первые вызовы выполняются интерпретатором.
  2. Профилирование: JVM собирает статистику (например, какие ветки кода выполняются чаще).
  3. JIT-компиляция: «Горячий» метод компилируется в оптимизированный нативный код.
  4. Подстановка (OSR): Выполнение может переключиться на скомпилированную версию даже в середине цикла (On-Stack Replacement).

Ключевые оптимизации JIT:

  • Инлайнинг (Inlining): Подстановка тела метода в место вызова.
  • Удаление неиспользуемого кода (Dead Code Elimination).
  • Свёртка констант (Constant Folding).

Пример на Java:

public class JitExample {
    public static void main(String[] args) {
        for (int i = 0; i < 100_000; i++) {
            hotMethod(); // После тысяч вызовов будет скомпилирован JIT'ом
        }
    }

    static void hotMethod() {
        // Логика «горячего» метода
    }
}