我想知道什麼是java.lang.StackOverflowError的根本原因。 我知道它是在遞歸調用無限次的方法時發生的,但是異常的實際原因是什麼以及默認的堆棧大小是多少?java.lang.StackOverflowError的根本原因
2
A
回答
0
只要內存的特定部分(「堆棧」)用完,就會發生stackoverflowerror。基本上你已經耗盡了分配給你的程序的內存,而不需要任何額外的內存,所以你的程序崩潰了。
具體來說,堆棧用於所有與調用函數和線程有關的東西,所以理論上你甚至可以通過創建一個新線程(儘管你首先需要幾乎用函數調用填充它)來耗盡內存。此外,遞歸不需要是無限的,只是非常大。
public int foo(int i){
if (i=0)
return 0;
return (foo(i-1)+foo(i-1)%1000);
}
然後調用foo(10000)將導致沒有無限的計算器。
如果您對發現堆棧更感興趣,我會建議遞歸如何在更低級別的語言(如程序集)中工作,您可以真正看到機器正在做什麼(請注意,學習這將花費很多負擔得起,但會讓你成爲一個更好的程序員)。
1
只有在遞歸調用的情況下才會引發它。每當堆棧內存空間填充堆棧中的典型數據時就會拋出:局部變量,本地參數等等。
顯然,獲得堆棧溢出錯誤的機會隨着堆棧的大小(當前正在執行的方法和線程的根之間有多少方法調用)以及活動線程的數量而增加。
但是,正如我所提到的,遞歸調用並不是獲得大型堆棧的唯一原因。
0
1
的根本原因是這樣的:堆棧大小是固定的在運行時,與VM提供沒辦法,一旦程序運行進行調整。但遞歸深度不固定,在許多情況下它取決於輸入數據。這就是爲什麼遞歸深度有時候並不是所有的堆棧幀都適合堆棧的原因。
相關問題
- 1. 死鎖的根本原因?
- 2. pthread_cond_timedwait()EINVAL的根本原因
- 3. 如何獲取FacesException的根本原因?
- 4. Shellshock Bash bug的根本原因
- 5. 沒有任何根本原因的IllegalStateException
- 6. Java根本原因java.lang.OutOfMemoryError錯誤
- 7. 多個Java根本原因異常
- 8. WCF CommunicationException:瞭解根本原因
- 9. Servlet Hello World錯誤 - 根本原因:java.lang.ClassNotFoundException:
- 10. 如何在線程「main」中找到異常的原因java.lang.StackOverflowError
- 11. EJB異常的根本原因。任何聰明的方法?
- 12. 「無效的對象名稱:dbo.etc」錯誤的根本原因?
- 13. Azure Active Directory Auth Broken - 沒有已知的根本原因
- 14. Tomcat沒有顯示初始化失敗的根本原因
- 15. 如何在SoapUI中找到連接重置的根本原因
- 16. 如何查看UmbrellaException的完整statcktrace(或根本原因)?
- 17. 無法找到TabBar上隨機崩潰的根本原因
- 18. org.hibernate.exception.GenericJDBCException:無法執行含有根本原因的查詢]
- 19. 重定向循環。無法進入的根本原因
- 20. 什麼是android.graphics.Path.finalize()在10秒後超時的根本原因
- 21. Spring Roo「撤消創建」/「撤消管理」的根本原因?
- 22. valgrind能否報告讀取uninit var的根本原因?
- 23. 檢測java中堆轉儲的根本原因
- 24. ConfigInstall操作失敗的根本原因是什麼?
- 25. 如何找到GWT排列的根本原因
- 26. 需要知道「OutOfMemoryError:Java堆空間」的根本原因
- 27. 本原根問題
- 28. 什麼原因導致「java.lang.IncompatibleClassChangeError:vtable存根」?
- 29. org.hibernate.exception.GenericJDBCException:無法打開連接]與根本原因java.sql.SQLException:
- 30. Java.lang.verifyerror我該如何解決甚至找出根本原因?
粘貼代碼.. – Kick
默認大小由VM設置,但您可以使用-Xss JVM參數設置大小。 –