В общем, Компиляция точно в срок означает компиляцию собственного кода во время выполнения и выполнение его вместо (или в дополнение к) интерпретации. Некоторые виртуальные машины, такие как Google V8, даже не имеют переводчика; они JIT компилируют каждую выполняемую функцию (с различной степенью оптимизации).
On Stack Replacement (OSR) - это метод для переключения между различными реализациями одной и той же функции. Например, вы можете использовать OSR для переключения с интерпретируемого или неоптимизированного кода на код JITed, как только он завершит компиляцию.
OSR полезна в ситуациях, когда вы определяете функцию как «горячую» во время ее работы. Это не обязательно может быть потому, что функция вызывается часто; он может быть вызван только один раз, но он проводит много времени в большом цикле, который может выиграть от оптимизации. Когда происходит OSR, виртуальная машина приостанавливается, и кадр стека для целевой функции заменяется эквивалентным кадром, который может иметь переменные в разных местах.
OSR также может происходить в другом направлении: от оптимизированного кода до неоптимизированного кода или интерпретируемого кода. Оптимизированный код может сделать некоторые предположения о поведении программы во время выполнения на основе прошлого поведения. Например, вы можете преобразовать виртуальный или динамический вызов метода в статический вызов, если вы когда-либо видели только один тип объекта-получателя. Если позже окажется, что эти предположения были неверны, OSR можно использовать для возврата к более консервативной реализации: оптимизированный кадр стека преобразуется в неоптимизированный кадр стека. Если виртуальная машина поддерживает встраивание, вы можете даже преобразовать оптимизированный кадр стека в несколько неоптимизированных кадров стека.