Java 8 中的非確定性堆疊深度
確定Java 中的最大遞歸深度對於理解記憶體堆疊利用率和潛在記憶體問題至關重要。然而,在 Oracle 的 Java 8 上,報告的結果可能是不確定的,而相較之下,OpenJDK 7 會產生一致的結果。
HotSpot 最佳化器的影響
The HotSpot 編譯器最佳化器顯著影響觀察到的行為。當遞歸方法是 JIT 編譯時,最佳化器可能會最佳化某些方法呼叫或合併多個呼叫的堆疊幀。此最佳化會導致更小的堆疊空間要求,從而允許更深的遞歸。
範例
考慮以下程式碼:
<code class="java">public static int countDepth() { try { return 1+countDepth(); } catch(StackOverflowError err) { return 0; } }</code>
使用JIT 的結果(來自Oracle 的Java 8):
2097 4195 4195 4195 12587 12587 12587
不使用JIT 的結果(來自Oracle 的Java 8):
2104 2104 2104 2104 2104 2104 2104
堆棧限制強制執行和ASLR
堆棧限制強制執行和ASLR
堆棧限制被強制執行和ASLR
堆棧限制強制執行和ASLR
堆棧限制。 🎜>影響非確定性的另一個因素是JVM 強制執行堆疊限制的方式。如果堆疊結束位址需要特殊對齊(例如,由於硬體限製而與頁邊界對齊),則初始堆疊分配可能具有較弱的對齊約束。與位址空間佈局隨機化 (ASLR) 結合,這可能會導致可用堆疊空間量可變,從而導致不確定的遞歸深度。 OpenJDK 7 中的確定性與Oracle 的Java 8 相比,OpenJDK 7 似乎對堆疊限制的執行更加一致,並且預設情況下不應用ASLR 。這解釋了 OpenJDK 7 中觀察到的確定性行為。以上是為什麼遞歸深度在 Java 8 中是非確定性的,但在 OpenJDK 7 中是確定性的?的詳細內容。更多資訊請關注PHP中文網其他相關文章!