Niektóre znaczące poszukiwania odkrywa to ciekawy mały fragment (I rzeczywiście dostał miarę stronie z wyszukiwarki Google):
if (inline_depth() > MaxInlineLevel) {
return "inlining too deep";
}
if (method() == callee_method
&& inline_depth() > MaxRecursiveInlineLevel) {
return "recursively inlining too deep";
}
które sugerują, że MaxInlineLevel
jest zgodnie z oczekiwaniami sztywny limit na to, jak głęboko idziesz przed zatrzymać inline. Sugeruje także, że numer MaxRecursiveInlineLevel
odnosi się tylko do bezpośrednich wywołań rekursywnych, a nie do wywołań rekurencyjnych, takich jak foo()
, wywołujących bar()
, które wywołują foo()
.
Więc myślę, że miał rację w Domyślam komentarza - MaxInlineLevel
jest ochrona przed wzajemnego rekursji ponieważ do wykrycia, że trzeba zachować odniesień do pełnej głębokości stosu wywołań inline.
MaxInlineResursionLevel
Sterowanie foo()
wywołań foo()
.
Należy zauważyć, że kod, do którego występuje odwołanie, może nie być prawdziwą maszyną JVM.
Komentarze od @apangin znajdują bardziej nowoczesną wersję hotspotu z Open JDK 8, sugerują, że obecnie nie jest to już tak proste. Wygląda na to, że cały stos jest poszukiwany dla wywołań rekursywnych, więc wzajemna rekursja może być teraz zablokowana przed przejściem obok MaxRecursiveInlineLevel
.
Nie jest to wcale pewne, ale prawdopodobnie uniknięcie wzajemnych pułapek rekurencyjnych, które mogą być trudne/drogie do obrony w inny sposób. – OldCurmudgeon
@ OldCurmudgeon, ale masz MaxRecursiveInlineLevel – MrSimpleMind
@MrSimpleMind - Interesujące - dlatego jestem wyraźnie w błędzie. To musi być inny powód. – OldCurmudgeon