歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

Java 常見內存洩漏及其解決方案

1. java.lang.OutOfMemoryError: Java heap space 解決方案

1.1    原因

JVM中如果98%的時間是用於GC且可用的, Heap size不足2%的時候將拋出此異常信息。

JVM堆的設置是指java程序運行過程中JVM可以調配使用的內存空間的設置。JVM在啟動的時候會自動設置Heap size的值,其初始空間(即-Xms)是物理內存的1/64,最大空間(-Xmx)是物理內存的1/4。

可以利用JVM提供的-Xmn -Xms -Xmx等選項可進行設置。Heap Size 最大不要超過可用物理內存的80%,一般的要將-Xms和-Xmx選項設置為相同,而-Xmn為1/4的-Xmx值。

Heap size的 -Xms -Xmn 設置不要超出物理內存的大小。否則會提示“Error occurred during initialization of VM Could not reserve enough space for object heap”。

1.2    從數據庫中查詢大量的數據

使用Java程序從數據庫中查詢大量的數據時出現異常: java.lang.OutOfMemoryError: Java heap space

解決辦法:

tomcat_home/bin下catalina.bat(win)或catalina.sh(linux)執行代碼前加上:

set JAVA_OPTS=%JAVA_OPTS% -Xms128m -Xmx512m

1.3    Eclipse下運行程序

eclipse 有啟動參數裡設置jvm大小,因為eclipse運行時自己也需要jvm,所以eclipse.ini裡設置的jvm大小不是具體某個程序運行時所用jvm的大小,這和具體程序運行的jvm大小無關。

在控制台運行的話不會存在這個問題,如:java -Xms256m -Xmx1024m classname,這樣就可以把當前程序的jvm大小給設定。

eclipse裡默認的一個程序的jvm配置為:-Xms8m -Xmx128m,所以我們的處理耗內存比較大時需要手動調整一下,以便不會內存溢出。

具體的設置方法為:選中被運行的類,點擊菜單‘Run as ->Open Run Dialog...’,選擇(x)=Argument標簽頁下的vm arguments框裡輸入 -Xmx512m, 保存運行。

1.4    Web程序

如果在啟動過程中出現內存溢出問題,拋出類似如下異常信息:java.lang.OutOfMemoryError: Java heap space

可以嘗試辦法:

(1) 修改Tomcat\bin\catalina.bat, 添加如下內容:

set JAVA_OPTS=-Xms256m -Xmx512m -Djava.awt.headless=true [-XX:MaxPermSize=128M]

(2) eclipse->windows->preferences..->tomcat->jvm..->jvm文本框裡,添加-Xms256m -Xmx512m

(3) eclipse->preference->java->instal jres->edit, 增加參數:-Xms256m -Xmx512m

2. java.lang.OutOfMemoryError: PermGen space及其解決方法

2.1    原因

PermGen space的全稱是Permanent Generation space,是指內存的永久保存區域。

OutOfMemoryError: PermGen space從表面上看就是內存益出,解決方法也一定是加大內存。

說說為什麼會內存益出:這一部分用於存放Class和Meta的信息,Class在被 Load的時候被放入PermGen space區域,它和和存放Instance的Heap區域不同,GC(Garbage Collection)不會在主程序運行期對PermGen space進行清理,所以如果你的APP會LOAD很多CLASS的話,就很可能出現PermGen space錯誤。這種錯誤常見在web服務器對JSP進行pre compile的時候。如果你的WEB APP下都用了大量的第三方jar, 其大小超過了jvm默認的大小(4M)那麼就會產生此錯誤信息了。

2.2    解決方法

手動設置MaxPermSize大小

修改TOMCAT_HOME/bin/catalina.sh,在“echo "Using CATALINA_BASE: $CATALINA_BASE"”上面加入以下行:

JAVA_OPTS="-server -XX:PermSize=64M -XX:MaxPermSize=128m

建議:將相同的第三方jar文件移置到tomcat/shared/lib目錄下,這樣可以達到減少jar 文檔重復占用內存的目的。

Copyright © Linux教程網 All Rights Reserved