在調測程序時報java.lang.OutOfMemoryError:GC overhead limit exceeded 錯誤
錯誤原因:在用程序進行數據切割時報了該錯誤。由於在本地執行數據切割測試的時候,數據量較小,並沒有發生異常,
可以正常執行。由於在現網的數據庫的數據量較大,在切割一張數據庫表數據時,數據量有四千多萬條,程序執行的邏輯是
先將其查詢出來放入集合當中,然后批量插入,由於數據量太大,new了一個集合容納不了,就會報內存溢出的錯誤。在網上
查了以后,列出一下的解決方案:
第一個方法:分批次查詢,分批次入庫,將集合的數據量固定在一萬條左右,每次操作一萬條數據,分批次操作
第二個方法:設置虛擬機內存大小,方法如下:
解決辦法:
1、增加參數,-XX:-UseGCOverheadLimit
2、增加heap大小
在catalina.bat最前面加入set JAVA_OPTS=-Xms512m -Xmx1024m
解釋一下各個參數:
-Xms1024M:初始化堆內存大小(注意,不加M的話單位是KB)
-Xmx1029M:最大堆內存大小
-XX:PermSize=256M:初始化類加載內存池大小
-XX:MaxPermSize=256M:最大類加載內存池大小
-XX:MaxNewSize=256M:tomcat對自身堆棧的新的最大的分配;當tomcat內存不足時,調用此分配;從而達到調優的目的。
設置Tomcat啟動的初始內存其初始空間(即-Xms)是物理內存的1/64,最大空間(-Xmx)是物理內存的1/4。
1、首先是:java.lang.OutOfMemoryError: Java heap space 解釋: Heap size 設置 JVM堆的設置是指java程序運行過程中JVM可以調配使用的內存空間的設置.JVM在啟動的時候會自動設置Heap size的值,其初始空間(即-Xms)是物理內存的1/64,最大空間(-Xmx)是物理內存的1/4。可以利用JVM提供的-Xmn -Xms -Xmx等選項可進行設置。Heap size 的大小是Young Generation 和Tenured Generaion 之和。
提示:在JVM中如果98%的時間是用於GC且可用的Heap size 不足2%的時候將拋出此異常信息。
提示:Heap Size 最大不要超過可用物理內存的80%,一般的要將-Xms和-Xmx選項設置為相同,而-Xmn為1/4的-Xmx值。
解決方法: 手動設置Heap size 修改TOMCAT_HOME/bin/catalina.bat,在“echo "Using CATALINA_BASE: $CATALINA_BASE"”上面加入以下行: Java代碼 set JAVA_OPTS=%JAVA_OPTS% -server -Xms800m -Xmx800m -XX:MaxNewSize=256m set JAVA_OPTS=%JAVA_OPTS% -server -Xms800m -Xmx800m -XX:MaxNewSize=256m 或修改catalina.sh 在“echo "Using CATALINA_BASE: $CATALINA_BASE"”上面加入以下行: JAVA_OPTS="$JAVA_OPTS -server -Xms800m -Xmx800m -XX:MaxNewSize=256m"
2、其次是:java.lang.OutOfMemoryError: PermGen space 原因: PermGen space的全稱是Permanent Generation space,是指內存的永久保存區域,這塊內存主要是被JVM存放Class和Meta信息的,Class在被Loader時就會被放到PermGen space中,它和存放類實例(Instance)的Heap區域不同,GC(Garbage Collection)不會在主程序運行期對PermGen space進行清理,所以如果你的應用中有很CLASS的話,就很可能出現PermGen space錯誤,這種錯誤常見在web服務器對JSP進行pre compile的時候。如果你的WEB APP下都用了大量的第三方jar, 其大小超過了jvm默認的大小(4M)那么就會產生此錯誤信息了。
解決方法: 1. 手動設置MaxPermSize大小 修改TOMCAT_HOME/bin/catalina.bat(Linux下為catalina.sh),在Java代碼 “echo "Using CATALINA_BASE: $CATALINA_BASE"”上面加入以下行: set JAVA_OPTS=%JAVA_OPTS% -server -XX:PermSize=128M -XX:MaxPermSize=512m “echo "Using CATALINA_BASE: $CATALINA_BASE"”上面加入以下行: set JAVA_OPTS=%JAVA_OPTS% -server -XX:PermSize=128M -XX:MaxPermSize=512m catalina.sh下為: Java代碼 JAVA_OPTS="$JAVA_OPTS -server -XX:PermSize=128M -XX:MaxPermSize=512m" JAVA_OPTS="$JAVA_OPTS -server -XX:PermSize=128M -XX:MaxPermSize=512m"