異常主要是處理編譯期不能捕獲的錯誤。出現問題時能繼續順利執行下去,而不致使程序終止,確保程序的健壯性。java
處理過程:產生異常狀態時,若是當前的context不具有處理當前異常的能力,將在heap上new出來一個異常對象,中止當前的執行路線,把產生的異常對象拋給更高層的context。面試
Throwable:異常類 Error:系統異常;不能恢復;Exception :普通異常;可恢復sql
利用try/catch/finally處理異常數據庫
某些事物(除內存外)在異常處理完後須要恢復到原始狀態,如:開啓的文件,網絡鏈接等。數組
異常表示程序運行過程當中可能出現的非正常狀態,運行時異常表示虛擬機的一般操做中可能遇到的異常,緩存
是通常常見的運行錯誤。java編譯器要求方法必須聲明拋出可能發生的非運行時異常,可是並不要求必須聲明拋出網絡
未被捕獲的運行時異常。指針
異常分爲runtime exception和checked exception對象
checked exception :java編譯器強制要求catch此類異常,如io異常、sql異常。遞歸
runtime exception:不須要強制性處理,一旦出現異常,交由虛擬機接管。
NullPointException:空指針
ArrayIndexOutOfBoundsException:數組越界
IllegalArgumentException:參數非法
BufferOverflowExeption:緩存溢出
ClassNotFoundException:在編譯時沒法找到指定類
ClassCastException:類型強轉
ExceptionInInitializerError:靜態初始值或靜態變量初始值期間發生異常
UnsatisfiedLinkError:JNI加載dll或者so文件時未找到
NoClassDefFoundError:在編譯時能找到合適的類,而在運行時不能找到合適的類
產生緣由:
一、內存中加載的數據量過於龐大,如上一次從數據庫取出過多的數據。
二、集合類中有對對象的引用,使用完後未清空,使得JVM不能回收。
三、代碼中存在死循環或循環產生過多重複的對象實體。
四、使用的第三方軟件中的Dug
五、啓動參數內存值設定的太小
一、檢查代碼中是否有死循環或遞歸循環
二、檢查是否有大循環重複產生新對象實體。
三、檢查對數據庫查詢中,是否有一次得到所有數據的查詢,通常來講,若是一次取出十萬條記錄到內存中,就可能引發內存溢出,這個問題
比較隱蔽,在上線前,數據庫中數據較少,不容易出問題,上線後,數據庫中數據多了,一次查詢就有可能引發內存溢出,所以對於數據庫查詢儘可能採用分頁
的方式查詢。
四、檢查LIst、Map等集合對象是否有使用後,未清除的問題,List、Map等集合對象會始終存有對對象的引用,使得這些對象不能被GC回收。
五、檢查對大文件的讀取是否採用類nio的方式。