1. 程式人生 > >Tomcat和JBoss加大啟動堆和非堆記憶體,防止記憶體溢位的方法

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初始分配的堆記憶體。

如果-Xmx不指定或者指定偏小,應用可能會導致java.lang.OutOfMemory錯誤,此錯誤來自JVM,不是Throwable的,無法用try...catch捕捉。

-Xmx512m JVM最大允許分配的堆記憶體。

-XX:PermSize=64M JVM初始分配的非堆記憶體,是JVM自己的,不是給開發人員用的,主要是用來存放ClassMeta的資訊,Class檔案在被 Load的時候被放入PermGen space區域,它和存放InstanceHeap堆區域不同。比如,這個往往發生在伺服器(tomcat)載入專案時,專案太大又沒設定非堆記憶體的話,啟動就會暴這個錯,因為大量

class檔案load到非堆記憶體,超過了非堆記憶體限制,就會暴PermGen space 錯誤,往往通過設定-XX:PermSize=64M -XX:MaxPermSize=128M解決,增大非堆記憶體。

-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