1. 程式人生 > >Tomcat報錯—Tomcat記憶體溢位及大小調整

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。