Heim > Java > javaLernprogramm > Hauptteil

Warum ist die Rekursionstiefe in Java 8 nicht deterministisch, in OpenJDK 7 jedoch deterministisch?

Linda Hamilton
Freigeben: 2024-10-29 06:16:30
Original
545 Leute haben es durchsucht

Why Is Recursion Depth Non-Deterministic in Java 8 but Deterministic in OpenJDK 7?

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>
Nach dem Login kopieren

Ergebnisse mit JIT (aus Oracles Java 8):

2097
4195
4195
4195
12587
12587
12587
Nach dem Login kopieren

Ergebnisse ohne JIT (aus Oracles Java 8):

2104
2104
2104
2104
2104
2104
2104
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage