天天看點

Tomcat記憶體洩露處理方法

java.lang.OutOfMemoryError: Java heap space

可以嘗試辦法:

A.修改Tomcat/bin/catalina.bat,添加如下内容

set JAVA_OPTS=-Xms256m -Xmx512m -Djava.awt.headless=true [-XX:MaxPermSize=128M]

B.eclipse->windows->preferences..->tomcat->jvm..->jvm文本框裡,添加-Xms256m -Xmx512m

C.eclipse->preference->java->instal jres->edit,增加參數:-Xms256m -Xmx512m

參考原因:JVM中如果98%的時間是用于GC且可用的, Heap size不足2%的時候将抛出此異常資訊。

JVM堆的設定是指java程式運作過程中JVM可以調配使用的記憶體空間的設定.JVM在啟動的時候會自動設定Heap size的值,其初始空間(即-Xms)是實體記憶體的1/64,最大空間(-Xmx)是實體記憶體的1/4。

可以利用JVM提供的-Xmn -Xms -Xmx等選項可進行設定。Heap Size 最大不要超過可用實體記憶體的80%,一般的要将-Xms和-Xmx選項設定為相同,而-Xmn為1/4的-Xmx值。

Heap size的 -Xms -Xmn 設定不要超出實體記憶體的大小。否則會提示“Error occurred during initialization of VM Could not reserve enough space for object heap”。

Tomcat預設可以使用的記憶體為128MB,在較大型的應用項目中,這點記憶體是不夠的,輕微時,會使系統性能急劇下降,嚴重時,将導緻系統無法運作,影響系統的穩定性。當記憶體不夠用時,常見的問題就是報tomcat記憶體益處錯誤,從兒導緻用戶端包500錯誤的,如下:解決方法主要是加大TOMCAT可利用記憶體,并在程式當中加大記憶體使用。是以根據應用的需求,有必要調整JVM使用記憶體的大小。現在将手工修改tomcat記憶體的方法及注意事項列出,希望能對新人有所幫助。

  tomcat提供了兩種安裝模式,即免安裝(*.zip)和安裝(*.exe)方式。針對不同的安裝方式下修改tomcat記憶體大小的方法幾注意問題(windows環境):

  方式1:當選擇安裝方式時,可以在安裝tomcat的過程進行設定tomcat初始化記憶體的大小。但是假如說在安裝時沒有選擇,或者應用改變了,需要增加tomcat記憶體時怎麼半呢?此時,我們就要手工修改tomcat的一些檔案了。

  看了很多網上的資料,都是說修改<CATALINA_HOME>bincatalina.bat檔案的内容,即在裡面增加一行代碼:

set JAVA_OPTS=-Xms512m -Xmx512m //表示初始化最小可用記憶體和最大可用記憶體都是512MB(修改相應值即可)

  如在catalina.bat的

rem ----- Execute The Requested Command

echo Using CATALINA_BASE: %CATALINA_BASE%

echo Using CATALINA_HOME: %CATALINA_HOME%

echo Using CATALINA_TMPDIR: %CATALINA_TMPDIR%

echo Using JAVA_HOME: %JAVA_HOME%

  這一欄改為

set JAVA_OPTS=-Xms512m -Xmx512m

  就可以将JAVA虛拟機配置設定記憶體 508.0625MB的!

  但是很多人修改後,發現修改并沒有起作用,即通過windows的服務啟動tomcat時,實際的記憶體還是預設的,修改的設定并沒有起作用;而通過<CATALINA_HOME>binstartup.bat 啟動卻是生效的。這是為什麼呢?因為在安裝過程中,JVM的初始化參數已經寫在系統資料庫中了,由于沒有修改系統資料庫中相關參數,是以以windows服務方式啟動時,修改的并沒有生效。而通過<CATALINA_HOME>binstartup.bat 啟動直接是通過<CATALINA_HOME>bincatalina.bat檔案中的配置的。你需要重新加載到系統服務中才生效,或者你手工在系統資料庫中查找修改啟動值,加載到服務中的時候參數已經配置好了,自己修改artup.bat不會改變系統資料庫中的參數設定。

  解決方法:修改系統資料庫中的參數,加入JVM初始化記憶體的參數:

HKEY_LOCAL_MACHINESOFTWAREApache Software FoundationTomcat Service ManagerTomcat5ParametersJavaOptions

  值為

-Dcatalina.home="C:ApacheGroupTomcat 5.0"

-Djava.endorsed.dirs="C:ApacheGroupTomcat 5.0commonendorsed"

-Xrs

  如加入 -Xms512m -Xmx800m

  方式2:針對免安裝的使用者,也可以通過将tomcat注冊為windows的一個服務的方式來實作:我們可以對service.bat檔案做一些其他修改,使tomcat更加能滿足我們各種不同需求時的要求

1. 如果讓tomcat編譯jsp檔案,就在PR_CLASSPATH中加入J2SDK的tools.jar

  修改前:

set PR_CLASSPATH=%CATALINA_HOME%binbootstrap.jar

  修改後:

set PR_CLASSPATH=%JAVA_HOME%libtools.jar; %CATALINA_HOME%binbootstrap.jar

  2.要使用一個特定的JVM,就要修改jvm的參數;要使注冊的windows服務的啟動方式為自動,增加--Startup Automatic,這個是比較常用的;要用定制的server.xml配置檔案并且傳遞多個參數給StartClass,要修改StartParams的值,各個值之間用分号分隔:

"%EXECUTABLE%" //IS//%SERVICE_NAME% --Jvm auto

--StartClass org.apache.catalina.startup.Bootstrap --StopClass org.apache.catalina.startup.Bootstrap

--StartParams start --StopParams stop

"%EXECUTABLE%" //IS//%SERVICE_NAME% --Jvm "%JAVA_HOME%jrebinserverjvm.dll"

--StartParams "-config; %CUSTOM_SERVERXML_FILE%; -nonaming; start" --StopParams stop

--Startup Automatic

  3. 指定最大和最小的記憶體限制,要增加jvm的初始參數

"%EXECUTABLE%" //US//%SERVICE_NAME% --JvmOptions

"-Dcatalina.base=%CATALINA_BASE%; -Dcatalina.home=%CATALINA_HOME%; -Djava.endorsed.dirs=%CATALINA_HOME%commonendorsed"

--StartMode jvm --StopMode jvm

"-Xms128M; -Xmx256M; -Dcatalina.base=%CATALINA_BASE%; -Dcatalina.home=%CATALINA_HOME%; -Djava.endorsed.dirs=%CATALINA_HOME%commonendorsed"

  4.有時注冊windows服務成功後,但是啟動服務時顯示“發生服務特定錯誤: 0.”就是因為jvm沒有指定,修改Jvm auto為Jvm "%JAVA_HOME%jrebinserverjvm.dll"後重新注冊windows服務就可以啟動了。