程序猿眼中的「電鋸驚魂」StackOverflowError

半夜突然收到電話:生產環境掛了,棧溢出了,趕緊過來定位.......。這個時候程序猿的心情時這樣的。

程序猿眼中的“電鋸驚魂”StackOverflowError

為何會出現StackOverflowError

Java虛擬機中的是一塊線程私有的內存空間,其中存儲的東西是棧幀,每次函數調用都會生成對應的一個棧幀壓入中,從而佔用一定的空間,所以,如果棧空間不足,函數就沒法繼續運行。當請求的棧深度大於最大可用棧深度時,虛擬機就會拋出StackOverflowError錯誤。

實例演示

  • 創建一個無出口的遞歸函數,設置棧大小為128K(-Xss128k)
程序猿眼中的“電鋸驚魂”StackOverflowError

程序猿眼中的“電鋸驚魂”StackOverflowError

  • 運行報StackOverflowError錯誤,並打印遞歸函數調用次數為1103次
程序猿眼中的“電鋸驚魂”StackOverflowError

  • 修改棧大小為256k,再次運行
程序猿眼中的“電鋸驚魂”StackOverflowError

  • 報StackOverflowError錯誤,並打印遞歸函數調用次數為2871次
程序猿眼中的“電鋸驚魂”StackOverflowError

總結:棧的空間不足,虛擬機拋出StackOverflowError錯誤,棧的大小決定函數調用的次數。


分享到:


相關文章: