4 回答

TA貢獻1831條經驗 獲得超10個贊
StackOverflowError
當堆棧(存儲方法執行堆棧的內存的一部分)與堆(分配對象,基元等的內存)發生沖突時,將引發。您無法預測何時引發錯誤,因為除非由 flag 指定,否則堆棧的大小可以是動態的。這就是為什么沒有固定的方法執行深度,這會導致.-Xss
StackOverflowError

TA貢獻1911條經驗 獲得超7個贊
JVM規范很好地解釋了它與堆棧相關的行為;
每個 Java 虛擬機線程都有一個私有 Java 虛擬機堆棧,與該線程同時創建。Java 虛擬機堆棧存儲幀 (§2.6)。Java虛擬機堆棧類似于傳統語言(如C)的堆棧:它保存局部變量和部分結果,并在方法調用和返回中發揮作用。由于 Java 虛擬機堆棧除了推送和彈出幀外,從不直接操作,因此可以堆分配幀。Java 虛擬機堆棧的內存不需要是連續的。
在 Java? 虛擬機規范的第一版中,Java 虛擬機堆棧被稱為 Java 堆棧。
此規范允許 Java 虛擬機堆棧具有固定大小,或者根據計算需要動態擴展和收縮。如果 Java 虛擬機堆棧的大小是固定的,那么在創建每個 Java 虛擬機堆棧時,可以獨立選擇該堆棧的大小。
Java 虛擬機實現可以為程序員或用戶提供對 Java 虛擬機堆棧初始大小的控制,以及在動態擴展或收縮 Java 虛擬機堆棧的情況下,控制最大和最小大小。
以下異常情況與 Java 虛擬機堆棧相關聯:
如果線程中的計算需要的 Java 虛擬機堆棧大于允許的堆棧,則 Java 虛擬機會引發 StackOverflowError。
如果可以動態擴展 Java 虛擬機堆棧,并且嘗試擴展,但沒有足夠的內存可用于實現擴展,或者如果沒有足夠的內存可用于為新線程創建初始 Java 虛擬機堆棧,則 Java 虛擬機將拋出一個 OutOfMemoryError。
就您的問題而言,本摘錄中的一個重要觀點是:
此規范允許 Java 虛擬機堆棧具有固定大小,或者根據計算需要動態擴展和收縮。
由于您沒有提供堆棧大小,因此 JVM 會嘗試動態擴展堆棧大小,因為該函數被遞歸調用,需要更多的堆棧內存。在每次運行中,它可能會為其堆棧找到不同數量的動態內存,具體取決于該運行點計算機上內存的可用性。這就是您在引發 SO 錯誤之前看到的迭代次數的不同值的原因。如果為程序配置(使用 JVM 參數)較小的堆棧大小,則在 SO 錯誤之前,您應該會看到大致相同的遞歸數。Xss<size>

TA貢獻1872條經驗 獲得超4個贊
因此,正如其他人所指出的那樣,您可能必須研究jvm正在使用什么生物,從那里了解使用垃圾回收器(gc調用的頻率)也可能是一個很好的練習,因為這可能會讓您更深入地了解堆棧溢出錯誤,而且可以讓您更深入地了解堆棧溢出錯誤,而且了解Java的一般工作方式。如果真的熱衷于,你可以實現自己的小JVM,并可能有一個更好的方案。
添加回答
舉報