Nichtdeterministische Stapeltiefe in Java 8
Die Bestimmung der maximalen Rekursionstiefe in Java kann für das Verständnis der Stapelauslastung und potenzieller Speicherprobleme von entscheidender Bedeutung sein . Unter Oracle Java 8 können die gemeldeten Ergebnisse jedoch nicht deterministisch sein, während OpenJDK 7 im Gegensatz dazu konsistente Ergebnisse liefert.
Einfluss des HotSpot-Optimierers
Der Der HotSpot-Compiler-Optimierer beeinflusst das beobachtete Verhalten erheblich. Wenn rekursive Methoden JIT-kompiliert werden, kann der Optimierer bestimmte Methodenaufrufe optimieren oder die Stapelrahmen mehrerer Aufrufe zusammenführen. Diese Optimierung führt zu einem geringeren Stapelplatzbedarf, was eine tiefere Rekursion ermöglicht.
Beispiel
Betrachten Sie den folgenden Code:
<code class="java">public static int countDepth() { try { return 1+countDepth(); } catch(StackOverflowError err) { return 0; } }</code>
Ergebnisse mit JIT (aus Oracles Java 8):
2097 4195 4195 4195 12587 12587 12587
Ergebnisse ohne JIT (aus Oracles Java 8):
2104 2104 2104 2104 2104 2104 2104
Stack-Limit-Durchsetzung und ASLR
Ein weiterer Faktor, der den Nichtdeterminismus beeinflusst, ist die Art und Weise, wie die JVM ihr Stack-Limit durchsetzt. Wenn die Stapelendadresse eine spezielle Ausrichtung erfordert (z. B. Ausrichtung an Seitengrenzen aufgrund von Hardwareeinschränkungen), unterliegt die anfängliche Stapelzuweisung möglicherweise einer schwächeren Ausrichtungsbeschränkung. In Kombination mit der Adressraum-Layout-Randomisierung (ASLR) könnte dies zu variablen Mengen an verfügbarem Stapelplatz führen, was zu nicht deterministischen Rekursionstiefen führen würde.
Determinismus in OpenJDK 7
Im Gegensatz zu Oracles Java 8 scheint OpenJDK 7 eine konsistentere Durchsetzung von Stack-Limits zu haben und wendet standardmäßig kein ASLR an. Dies erklärt das in OpenJDK 7 beobachtete deterministische Verhalten.
Das obige ist der detaillierte Inhalt vonWarum ist die Rekursionstiefe in Java 8 nicht deterministisch, in OpenJDK 7 jedoch deterministisch?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!