Tomcat報錯—Tomcat記憶體溢位及大小調整
本文記錄一些常見的Tomcat經常出現的記憶體溢位問題,在查詢大量資料和載入jar包出現異常。一般JVM記憶體溢位(OOM),分為堆記憶體溢位和PermGen區記憶體溢位:
1:java.lang.OutOfMemoryError: PermGen space(PermGen區記憶體溢位)
PermGen space(Permanent Generation space),是指記憶體的永久儲存區域,
主要用於存放Class和Meta資訊的,Class在被Loader時就會被放到PermGen space中,
它和存放類例項(Instance)的Heap區域不同,GC(Garbage Collection)不會在主程式執行期對其進行清理,
所以如果應用中有很多CLASS的話,就很可能出現PermGen space錯誤。如果載入的Class超過MaxPermSize,
就會丟擲該異常,可以通過調整MaxPermSize進行解決。
這種錯誤常常出現在WEB伺服器在對專案中的JSP進行pre—compile(預編譯)的時候,
還有就是專案使用了很多的第三方的jar包,這個jar的大小超過了JVM預設的大小(4M),
也是會出現此錯誤的。
2:java.lang.OutOfMemoryError: Java heap space(堆溢位)
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值。
這兩種方式的解決方法,在/bin/catalina.bat檔案新增,根據自己的需求修改記憶體大小
加入JAVA_OPTS="-server -XX:PermSize=64M -XX:MaxPermSize=128m
rem ----- Execute The Requested Command ---------------------------------------
JAVA_OPTS="-server -XX:PermSize=64M -XX:MaxPermSize=128m"
echo Using CATALINA_BASE: "%CATALINA_BASE%"
echo Using CATALINA_HOME: "%CATALINA_HOME%"
echo Using CATALINA_TMPDIR: "%CATALINA_TMPDIR%"
解釋:
JAVA_OPTS='-Xms【初始化記憶體大小】 -Xmx【可以使用的最大記憶體】'
需要把這個兩個引數值調大。例如:
JAVA_OPTS='-Xms256m -Xmx512m'
表示初始化記憶體為256MB,可以使用的最大記憶體為512MB。