Подтвердить что ты не робот

Почему у JVM максимальная встроенная глубина?

java имеет аргумент -XX:MaxInlineLevel (со значением по умолчанию 9), который управляет максимальным количеством вложенных вызовов в строку. Почему существует такой предел? Почему не обычные эвристики, основанные на частоте и размере кода, достаточные для того, чтобы JVM сама решала, насколько глубоко встроена?

(это вызвано JitWatch, показывающим, что глубоко вложенный вызов Guava checkArgument не был встроен из-за глубины)

4b9b3361

Ответ 1

Некоторые существенные поиски раскрывают этот интересный небольшой фрагмент (я действительно получил до страницы 4 Google поиск):

    if (inline_depth() > MaxInlineLevel) {
        return "inlining too deep";
    }
    if (method() == callee_method
            && inline_depth() > MaxRecursiveInlineLevel) {
        return "recursively inlining too deep";
    }

Что свидетельствует о том, что MaxInlineLevel является ожидаемым жестким пределом того, насколько глубоко вы идете до того, как перестанете встраивать. Он также предполагает, что MaxRecursiveInlineLevel относится только к прямым рекурсивным вызовам, а не к рекурсивным вызовам, таким как foo() вызывает bar(), который вызывает foo().

Итак, я думаю, что я был прав в своем комментарии догадки - MaxInlineLevel заключается в защите от рекурсии взаимной, потому что обнаруживать, что вам нужно будет поддерживать ссылки на всю глубину стека вызовов inlining.

MaxInlineResursionLevel управляет foo() вызывает foo() вложение.

Обратите внимание, что ссылочный код не может быть реальной JVM.

Комментарии @apangin обнаруживают более современную версию точки доступа из Open JDK 8, говорят о том, что в настоящее время это уже не так просто. Похоже, что полный стек ищет рекурсивные вызовы, поэтому взаимная рекурсия также может быть заблокирована от прохождения MaxRecursiveInlineLevel.