1. 程式人生 > >java記憶體溢位的常見情況和處理方式總結

java記憶體溢位的常見情況和處理方式總結

注:建議如果是面試,只用說第一部分就OK,個人見解,視情況而定。一:總結:建議面試時可以簡略說java.lang.OutOfMemoryError這個錯誤是開發中經常遇到的錯誤,產生該錯誤的原因大都出於一下原因:JVM記憶體過小,程式不嚴謹,不健壯,產生了過多的垃圾。

常見錯誤:

1.tomcat:java.lang.OutOfMemoryError:PermGen space

2.tomcat:java.lang.OutOfMemoryError:Java heap space

3.java:java.lang.OutOfMemoryError

原因:

1.記憶體中載入的資料量過大,如一次從資料庫取過多資料;

2.集合類中有對物件的引用,實用完後未清空,使得JVM不能回收;

3.程式碼中存在死迴圈或大迴圈產生過多重複的物件實體;

4.啟動引數記憶體值設定的過小

解決方法:

1.建議查詢大量資料分頁查詢;

2.優化程式,釋放垃圾(主要避免死迴圈,應該及時釋放各種資源:記憶體,資料庫的各種連線,防止一次載入過多的資料。導致java.lang.OutOfMemoryError的根本原因是程式不健壯。因此,從根本上解決記憶體溢位的唯一方法就是修改程式,及時釋放沒用的物件,釋放記憶體空間)

3.斷點跟蹤,是否出現集合被一直引用或者重複建立例項的情況,及時修改程式

4.增加jvm的記憶體大小,主要方法有1)在執行某個class檔案時候,可以使用java -Xmx256M aa.class來設定執行aa.class所允許佔用的最大記憶體為256M。2)對tomcat容器,可以在啟動時對jvm設定記憶體限度,在catalina。bat檔案中新增:

set CATALINA_OPTS=-Xms128M -Xmx256M
set JAVA_OPTS=-Xms128M -Xmx256M

或者把%CATALINA_OPTS%和%JAVA_OPTS%代替為-Xms128M -Xmx256M

二:詳細,若就某個點來說,可以考慮以下說法,面試建議簡潔有力的點說,不建議像下面一樣詳細說明。

1.Java程式碼導致OutOfMemoryError

原因:

程式程式碼的不嚴謹,不健壯引起的

解決方法:

1.檢查程式碼中是否有死迴圈或者遞迴呼叫

2.檢查是否有大迴圈重複產生新物件實體

3.檢查對資料查詢中,是否有一次獲得全部資料的查詢。一般來說,如果一次取十萬條記錄到記憶體,就可能引起記憶體溢位。這個問題比較隱蔽,在上線前,資料庫中資料比較少,不容易出問題,上線後,資料庫中資料多了,一次查詢就有可能引起記憶體溢位因此對於資料庫查詢儘量採用分頁的方式查詢。

4.檢查List,Map等集合物件是否有使用完,未清除的問題。List,Map等集合物件會始終存在有對物件的引用,使得這些物件不能C回收。

2.tomcat:java.lang.OutOfMemoryError:PermGen space

原因:

PermGen space的全名是Permanent Generation space是指永久儲存區域,這塊記憶體主要是被JVM存放Class和Meta資訊的,Class在被Loade時就會被放到PermGen space中。它和存放類例項(Instance)的Heap區域不同,GC(Garbage Collection)不會在主程式執行期間對PermGen space進行清理,所以如果你的應用中有很多CLASS的話,就很可能出現PermGen apace錯誤。這種錯誤常見在web伺服器對JSP進行pre compile 的時候。

還有一種情況就是如果你的WEB APP下都用了大量的第三方jar,其大小超過了jvm預設的大小(4M)那麼就會產生次錯誤資訊了。

解決辦法:

1.手動設定MaxPermSize大小修改TOMCAT_HOME/bin/catalina.sh檔案中

echo "Using CATALINA_BASE:   $CATALINA_BASE"

上面加入以下行:

JAVA_OPTS="-server -XX:PermSize=64M -XX:MaxPermSize=128m
2.將相同的第三方jar檔案移植到tomcat/shared/lib目錄下,這樣就可以達到減少jar文件重複佔用記憶體的目的