StackOverFlowError和OutOfMemoryError的原因和處理方法

對於現在的我而言,虛擬機就好像黑盒子一樣,無法深入查看。
只會簡單的通過jconsole等工具查看一下
在這裏插入圖片描述
從我接觸的最能直接可見反饋虛擬機的異常的就只有StackOverFlowError和OutOfMemeryError這兩種異常。

有可能會問,虛擬機的內存不是動態分配自動回收的嗎?

是的,這只是簡化了程序員寫代碼的複雜性,不需要每次都考慮對象的回收和內存控制,但是一樣會存在內存崩潰的情況。
想想虛擬機申請內存收到物理內存的限制,如果應用產生的對象非常多,而且都非常重要不能讓虛擬機回收的,那超出了內存一樣會崩潰。

下面言歸正傳:

一、StackOverFlowError

先來分析一下StackOverFlowError異常,這個異常相對比較簡單出現的概率比較低:

1、原因

1.1、發生的地方:虛擬機棧和本地方法棧
1.2、線程調用生成的棧楨深度超過了虛擬機允許的深度(比如一個方法A內調用了方法B,然後B又調用C...這樣調用了1萬層,就像你要去地獄十八層,但是虛擬機只提供了到九層的梯子),不過現在大多數虛擬機棧的調動深度都是可以動態擴展的,所以這個問題出現的概率非常的低。

2、辦法

2.1、我還遇到什麼好的解決辦法

二、OutOfMemeryError

1、發生的地方:

1.1、基本上虛擬機的運行時數據區域(堆,棧,方法區)都會發生

2、發生的原因

2.1、內存不夠,發生了內存溢出

3、辦法

3.1、申請更多內存,調整虛擬機的啓動參數
-Xms1500m -Xmx1500m -XX:PermSize=125M -XX:MaxPermSize=256M
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章