33просмотров
30 января 2026 г.
Score: 36
🔄 OSR: Как JVM перекомпилирует код прямо во время выполнения JIT-компиляция — это не только «прогрев». JVM умеет переключаться с интерпретатора на скомпилированный код посреди выполнения метода! 🖥 Сценарий: У вас есть долгий цикл, который выполняется тысячи итераций. JVM не будет ждать следующего вызова метода — она перекомпилирует его прямо во время выполнения текущего вызова. ⚙️Как это работает: Интерпретатор исполняет метод ↓
Счётчик итераций цикла достигает порога (например, 10K) ↓
JVM останавливает выполнение метода ↓
Компилирует метод в нативный код (C1/C2) ↓
Продолжает выполнение со скомпилированной версии ↓
Сохранение состояния (регистры, стек) → самое сложное!
👩💻 Пример кода, где это важно: public void processData(List<Data> items) { // Долгий цикл for (Data item : items) { // 100_000 элементов transform(item); // OSR сработает здесь! }
}
🔍 Наблюдаем в логах: -XX:+PrintCompilation
# Вывод будет содержать '%' для OSR-компиляции
# 324 34 % 3 com.example.Foo::processData @ 5 (63 bytes)
⚠️Почему это важно знать? ✈️ 1. Бенчмаркинг: Первые несколько итераций цикла могут быть медленными
✈️ 2. Профилирование: Стектрейсы могут показывать странные метки
✈️3. Оптимизации: JVM может по-разному оптимизировать OSR vs обычную компиляцию 📌 *Итог: OSR — одна из самых сложных частей JVM, которая позволяет Java работать быстро даже в долгих циклах без явного «прогрева». ✈️Подписаться: @iamjavadev #jit #osr #производительность #сакральныезнания