Einige bedeutende Suche deckt diese interessante kleine fragment (Ich habe tatsächlich so weit Seite die Google-Suche):
if (inline_depth() > MaxInlineLevel) {
return "inlining too deep";
}
if (method() == callee_method
&& inline_depth() > MaxRecursiveInlineLevel) {
return "recursively inlining too deep";
}
, die darauf hindeuten, dass die MaxInlineLevel
wie erwartet eine harte Grenze, wie tief gehen Sie, bevor Sie inlining stoppen. Es schlägt auch vor, dass die MaxRecursiveInlineLevel
bezieht sich nur auf direkte rekursive Aufrufe, nicht umgekehrt rekursive Aufrufe wie foo()
Anrufe bar()
, die foo()
ruft.
Also ich denke, ich in meiner Vermutung Kommentar richtig war - MaxInlineLevel
gegen gegenseitige Rekursion zu schützen, ist da zu erkennen, dass Sie Verweise auf die volle Tiefe des inlining Call-Stack halten müßten.
MaxInlineResursionLevel
Steuerungen foo()
Anrufe foo()
Inlining.
Beachten Sie, dass der referenzierte Code möglicherweise keine echte JVM ist.
Kommentare von @apangin findet eine modernere Version von Hotspot von Open JDK 8 vermuten, dass es heutzutage nicht mehr ganz so einfach ist. Es sieht so aus, als ob der vollständige Stapel nach rekursiven Aufrufen durchsucht wird, so dass die gegenseitige Rekursion jetzt auch daran gehindert werden kann, über MaxRecursiveInlineLevel
hinauszugehen.
Keineswegs sicher, aber wahrscheinlich, um gegenseitige Rekursionsfallen zu vermeiden, die sich auf andere Weise schwierig/teuer abwehren lassen. – OldCurmudgeon
@OldCurmudgeon aber dann hast du die MaxRecursiveInlineLevel – MrSimpleMind
@MrSimpleMind - Interessant - ich bin also eindeutig falsch. Muss ein anderer Grund sein. – OldCurmudgeon