Java: метод JIT-inline

Когда Java JIT встроил вызов метода? Является ли оно основано на # раз, когда вызывается метод вызывающего (если да, каким будет это число?) Или некоторые другие критерии (и что это будет?)

Я читал, что JIT может встроить "окончательные" методы, но также включает нефинальные методы, основанные на статистике времени выполнения, поэтому вы хотите знать, что это за критерии запуска.

Я думаю, ответы будут отличаться в зависимости от реализации JVM, но может быть, что-то общее для всех из них?

Ответы

Ответ 1

Короткий ответ - когда захочет.

Очень часто JITC автоматически встраивает мелкие конечные или псевдоконфигурированные методы без предварительного сбора любых статистических данных. Это потому, что легко видеть, что вложение фактически сохраняет байты кода и кодирует вызов (или, по крайней мере, это почти "стирает" ).

Встраивание действительно не конечных методов обычно не выполняется, если статистика не говорит о целесообразности, поскольку вложенные не-финалы должны быть "защищены" каким-то образом в случае неожиданного подкласса.

Что касается количества раз, которое может быть вызвано до того, как оно будет JITCed или inlined, оно будет сильно изменяться и, вероятно, будет изменяться даже в пределах запущенной JVM.

Ответ 2

пороговое значение по умолчанию для JVM, использующего компилятор Hotspot сервера, составляет 35 байт-кодов.

Официальные документы

Ответ 3

Обычно JIT ограничивает только "маленькие" методы по умолчанию. Кроме того, он полностью зависит от реализации.