Tomcat和JBoss加大啟動堆和非堆記憶體,防止記憶體溢位的方法
直接上圖:
JBoss,找到%bin%/run.bat,用記事本開啟,找到以下位置,並新增後面那段(即加大堆記憶體的方法):
Tomcat,
在%Tomcat%/bin目錄下,新建如:run1.bat檔案,內容如下:
set java_home=C:/j2sdk1.4.2_08
startup.bat -Xms512m -Xmx1024m -XX:MaxPermSize=256m -XX:PermSize=256M
即增加了啟動的引數,加大啟動記憶體。
在eclipse上的操作,如圖:
對於這4個引數的解釋如下:
-Xms128m -Xmx512m -XX:MaxPermSize=64m -XX:PermSize=128M
這四個引數其實都是JVM引數,
-Xms128m JVM初始分配的堆記憶體
-Xmx512m JVM最大允許分配的堆記憶體,按需分配
-XX:PermSize=64M JVM初始分配的非堆記憶體
-XX:MaxPermSize=128M JVM最大允許分配的非堆記憶體,按需分配
(
關於java記憶體機制,可參考我的另外一篇部落格
)
Xms 和Xmx針對的是堆記憶體,是java程式碼可及的記憶體,是給開發人員使用的記憶體,比如,你把資料庫的海量資料都load到記憶體裡超過分配的堆記憶體,就會暴記憶體溢位,這個記憶體溢位就是OutOfMemory,堆溢位。
-Xms128m JVM初始分配的堆記憶體。
-Xmx512m JVM最大允許分配的堆記憶體。
-XX:PermSize=64M JVM初始分配的非堆記憶體,是JVM自己的,不是給開發人員用的,主要是用來存放Class和Meta的資訊,Class檔案在被
Load的時候被放入PermGen space區域,它和存放Instance的Heap堆區域不同。比如,這個往往發生在伺服器(tomcat等)載入專案時,專案太大又沒設定非堆記憶體的話,啟動就會暴這個錯,因為大量
-XX:MaxPermSize設定過小會導致java.lang.OutOfMemoryError: PermGen space就是記憶體益出。
這兩種拋的異常是不一樣的,堆記憶體益處是java.lang.OutOfMemory,非堆記憶體溢位會報java.lang.OutOfMemoryError: PermGen space。
對於tomcat安裝版,很多人在<CATALINA_HOME>\bin\catalina.bat檔案的內容,即在裡面增加一行程式碼:
set JAVA_OPTS=-Xms512m -Xmx512m
但發現不起作用.即通過windows的服務啟動tomcat時,實際的記憶體還是預設的,修改的設定並沒有起作用;而通過<CATALINA_HOME>\bin\startup.bat啟動卻是生效的。這是為什麼呢?因為在安裝過程中,JVM的初始化引數已經寫在登錄檔中了,由於沒有修改登錄檔中相關引數,所以以windows服務方式啟動時,修改的並沒有生效。而通過<CATALINA_HOME>\bin\startup.bat啟動直接是通過<CATALINA_HOME>\bin\catalina.bat檔案中的配置的。你需要重新載入到系統服務中才生效,或者你手工在登錄檔中查詢修改啟動值,載入到服務中的時候引數已經配置好了,自己修改sartup.bat不會改變登錄檔中的引數設定。解決方法:修改登錄檔中的引數,加入JVM初始化記憶體的引數:
HKEY_LOCAL_MACHINE\SOFTWARE\Apache Software Foundation\Tomcat Service Manager\Tomcat5\Parameters\JavaOptions
值為
-Dcatalina.home="C:\ApacheGroup\Tomcat 5.0"
-Djava.endorsed.dirs="C:\ApacheGroup\Tomcat 5.0\common\endorsed"
-Xrs
如加入 -Xms512m -Xmx800m