內存溢出和內存泄漏的區別
1. 內存溢出:out of memory ,是指程序在申請內存時,沒有足夠的內存空間供其使用,出現out of memory;好比申請了一個integer,但給它存了long才能存下的數,那就是內存溢出。
例如:
1.內存中加載的數據量過於龐大,如一次從數據庫取出過多數據;
2.集合類中有對對象的引用,使用完後未清空,使得JVM不能回收;
3.代碼中存在死循環或循環產生過多重複的對象實體;
4.使用的第三方軟件中的BUG;
5.啓動參數內存值設定的太小數據庫
2. 內存泄漏:memory leak,是指程序在申請內存後,沒法釋放已申請的內存空間,一次內存泄露危害能夠忽略,但內存泄露堆積後果很嚴重,不管多少內存,早晚會被佔光。
例如:網絡
- 靜態集合類:集合容器中的對象在程序結束前得不到釋放,會形成內存堆積;
Vector v=new Vector(10);
for(int i=0;i<10;i++){
Object o=new Object();
v.add(o);
}
- 各類鏈接:數據庫鏈接,網絡鏈接,以及io鏈接,鏈接後得不到關閉,
- 監聽器:在使用多個監聽器後,釋放了對象,而沒有刪除監聽器,也可能致使內存溢出;
- 變量不合理的做用域:若是一個變量的定義的做用範圍大於其使用範圍,還有,沒有及時把對象設置爲null,可能這是咱們比較常常出現的問題,因此有一些變量咱們能夠設置爲方法做用範圍內,當方法使用完,就釋放了。