半夜突然收到電話:生產環境掛了,棧溢出了,趕緊過來定位.......。這個時候程序猿的心情時這樣的。
為何會出現StackOverflowError
Java虛擬機中的棧是一塊線程私有的內存空間,其中存儲的東西是棧幀,每次函數調用都會生成對應的一個棧幀壓入棧中,從而佔用一定的棧空間,所以,如果棧空間不足,函數就沒法繼續運行。當請求的棧深度大於最大可用棧深度時,虛擬機就會拋出StackOverflowError錯誤。
實例演示
- 創建一個無出口的遞歸函數,設置棧大小為128K(-Xss128k)
- 運行報StackOverflowError錯誤,並打印遞歸函數調用次數為1103次
- 修改棧大小為256k,再次運行
- 報StackOverflowError錯誤,並打印遞歸函數調用次數為2871次
總結:棧的空間不足,虛擬機拋出StackOverflowError錯誤,棧的大小決定函數調用的次數。
閱讀更多 Lucif墮落天使 的文章