java.lang.OutOfMemoryError異常解決方法

緣由:
常見的有如下幾種:
1.內存中加載的數據量過於龐大,如一次從數據庫取出過多數據;
2.集合類中有對對象的引用,使用完後未清空,使得JVM不能回收;
3.代碼中存在死循環或循環產生過多重複的對象實體;
4.使用的第三方軟件中的BUG;
5.啓動參數內存值設定的太小;

常見錯誤提示:
1.tomcat:java.lang.OutOfMemoryError: PermGen space 
2.tomcat:java.lang.OutOfMemoryError: Java heap space
3.tomcat:java.lang.OutOfMemoryError: unable to create new native thread
4.weblogic:Root cause of ServletException java.lang.OutOfMemoryError
5.resin:java.lang.OutOfMemoryError
6.java:java.lang.OutOfMemoryError

分爲兩種狀況:
一、用dos窗口啓動tomcat
Windows下,在文件{tomcat_home}/bin/catalina.bat
在文件開頭可增長以下設置:
java

set JAVA_OPTS=-Xms512m -Xmx512m -Xss1024k -XX:MaxNewSize=256M -XX:MaxPermSize=256M

Unix/Linux下,在文件{tomcat_home}/bin/catalina.sh的前面,可增長以下設置:
web

JAVA_OPTS='-Xms512m -Xmx512m -Xss1024k -XX:MaxNewSize=256M -XX:MaxPermSize=256M'

各參數釋義:
-Xms:程序初始化的時候內存棧的大小。
-Xmx:應用程序(不是jvm)可以使用的最大內存數,這個值也不該該設置過大,超過機器內存。不然,tomcat會沒法啓動。此值能夠設置與-Xmx相同,以免每次垃圾回收完成後JVM從新分配內存。
-Xss:設置每一個線程的堆棧大小。JDK5.0之後每一個線程堆棧大小爲1M。
-XX:MaxPermSize:設置持久代大小
-XX:NewSize:設置年輕代大小

二、tomcat作爲系統服務
修改tomcat路徑下bin文件夾下service.bat文件
找到"%EXECUTABLE%" //US//%SERVICE_NAME% --JvmOptions
在後面的雙引號""中間添加:數據庫

-Xms512M;-Xmx1024M;-XX:NewRatio=3;-XX:PermSize=256M;-XX:MaxPermSize=512M;-XX:-UseGCOverheadLimit;

而後卸載掉服務,從新安裝一遍,啓動,生效。
-----------------------------------------------------
一、java.lang.OutOfMemoryError: unable to create new native thread
常見出如今進行
tomcat

set JAVA_OPTS=-Xms512m -Xmx512m -Xss1024k -XX:MaxNewSize=256M -XX:MaxPermSize=256M

設置後
JVM申請的heap會佔用相同大小的地址空間(address space)。在Windows 32位操做系統中,分配給每一個程序的地址空間只有2GB(固然也有3GB的開關)。
而每一個不一樣的JVM的堆和其建立的進程棧都依賴於同一個進程地址空間,因此這也是此消彼長的緣由。 
有方法能夠提升建立線程的數量: 減小單個線程棧的大小,在JVM啓動中使用-Xss參數。
建議
jvm

set JAVA_OPTS=-Xms512m -Xmx512m -Xss512k -XX:MaxNewSize=256M -XX:MaxPermSize=256M

二、Exception in thread "main" java.lang.OutOfMemoryError: GC overhead limit exceeded
常見出如今進行
在後面的雙引號""中間添加:spa

-Xms512M;-Xmx1024M;-XX:NewRatio=3;-XX:PermSize=256M;-XX:MaxPermSize=512M;-XX:-UseGCOverheadLimit;

設置後
JDK6新增錯誤類型。當GC爲釋放很小空間佔用大量時間時拋出。
通常是由於堆過小。致使異常的緣由:沒有足夠的內存。
建議
在雙引號""中間添加一個-XX:-UseGCOverheadLimit;
操作系統