tgoop.com/javaproglib/7080
Create:
Last Update:
Last Update:
⚡️ Просто о сложном: как JIT делает код быстрее
Вы когда-нибудь задумывались, как JIT умеет так ловко оптимизировать код в реальном времени?
Сегодня разберём, какие именно суперспособности JIT даёт вашему коду.
🔹 Инлайнинг методов
Когда JIT обнаруживает, что какой-то метод выполняется слишком часто, он может инлайнить его. Это значит, что весь код метода не будет вызываться отдельно, а его инструкции будут вставляться прямо в место вызова.
Пример:
int sum(int a, int b) {
return a + b;
}
int result = sum(5, 10);
Стало:
int result = 5 + 10; // JIT инлайнит код метода sum
🔹 Удаление мертвого кода
JIT всегда анализирует, выполняется ли тот или иной участок кода. Если метод или условие никогда не будет вызвано (например, условие, которое всегда ложно), JIT его удаляет.
🔹 Оптимизация циклов
Циклы — частая конструкция, и JIT всегда старается оптимизировать их выполнение. Например, если цикл выполняется много раз, JIT может переработать его для уменьшения количества операций.
🔹 Параллельная компиляция
Если ранее компиляция шла поэтапно, сейчас JIT может компилировать несколько частей программы одновременно. Это не только ускоряет работу компилятора, но и уменьшает задержки при запуске программы.
🔹 Использование final переменных
JIT предполагает, что final переменные не изменяются после инициализации. Это даёт компилятору возможность предсказать их значения и оптимизировать операции с ними.
🔹 Удаление лишних проверок
JIT понимает, какие проверки в коде избыточны. Например, если переменная была уже проверена на null, и это значение не изменяется, JIT может просто игнорировать повторные проверки.
🔹 Классификация горячих и холодных методов
JIT следит за тем, какие методы выполняются часто (горячие) и какие — нет (холодные). Он решает компилировать только те методы, которые чаще всего используются. Если горячий метод вдруг перестаёт быть горячим, JIT может освободить его от компиляции, освобождая ресурсы.
🔹 Слияние и удаление дубликатов
Если программа выполняет одинаковые операции несколько раз, JIT сливает их в одну или избавляется от дублирующихся вычислений.
Пример:
int a = 5;
int b = 5;
int c = a + b;
int d = a + b; // Дублирование
JIT может понять, что a + b одинаково для обеих операций, и просто использовать результат из первого вычисления во втором.
#CoreJava