Я понимаю, как работает on-stack replacement (OSR), но я не понимаю, полезен ли метод компиляции OSR, когда метод покидает начальный вызов, который вызвал компиляцию, - может ли JITed-код использоваться на последующей итерации ?Могут ли скомпилированные методы OSR использоваться последующим вызовом?
Кажется, он мог, как только интерпретатор перейдет к одному и тому же индексу байт-кода, который стартовал в OSR, он снова может ввести метод, скомпилированный OSR.
Я спрашиваю, главным образом, потому что я вижу случай, когда Hotspot немедленно OSR компилирует мой метод дважды (для разных BCI), но даже не выполняет компиляцию C2, отличную от OSR, до тех пор, пока она не будет запущена для пару минут (несмотря на миллион звонков или больше на метод). Поэтому мне интересно, использует ли он метод OSR C2 (существует также метод non-OSR C1)?
Да, и, в конце концов, я не воспроизвел его - в дальнейшем прогон в основном показал, что горячий метод получает нормальный не-OSR C2 (уровень 4) в течение секунды или около того после запуска, поэтому я не уверен, что был поднят. Возможно, это был сбой в выходе LogCompilation (например, сбитый PrintAssembly, который одновременно писал?), Потому что _timing_, казалось, указывал, что он работает нормально. – BeeOnRope
Возможно, вы имели в виду «на том же байткоде ** индекс **, они были созданы для ...» выше? – BeeOnRope
@BeeOnRope Да, спасибо за исправление. – apangin