首頁 > Java > java教程 > 為什麼遞歸深度在 Java 8 中是非確定性的,但在 OpenJDK 7 中是確定性的?

為什麼遞歸深度在 Java 8 中是非確定性的,但在 OpenJDK 7 中是確定性的?

Linda Hamilton
發布: 2024-10-29 06:16:30
原創
584 人瀏覽過

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

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中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板