對於現在的我而言,虛擬機就好像黑盒子一樣,無法深入查看。
只會簡單的通過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