1. 程式人生 > >java專案記憶體溢位問題解決方法

java專案記憶體溢位問題解決方法

 }
      寫程式碼的時候處理記憶體溢位   
         try{   
            //do   sth   
  ....   
         }catch   (outofmemoryerror   e){//
可以用一個共通函式來執行.   
          system.out.print   (
no   memory!   );   
          system.gc();   
           //do   sth   again   
        ....   
         }  
4.對於頻繁申請記憶體和釋放記憶體的操作,還是自己控制一下比較好,但是System.gc()的方法不一定適用,最好使用finallize強制執行或者寫自己的finallize方法。Java 中並不保證每次呼叫該方法就一定能夠啟動垃圾收集,它只不過會向JVM發出這樣一個申請,到底是否真正執行垃圾收集,一切都是個未知數。
Tomcat
&Java記憶體溢位的處理


http://blog.sina.com.cn 2007年11月04日09:29 曉光
標籤:
學習公社
 

  
11月1日

以tomcat環境為例,其它WEB伺服器如jboss,weblogic等是同一個道理。
一、java.lang.OutOfMemoryError: PermGen space PermGen space的全稱是Permanent Generation space,是指記憶體的永久儲存區域,
這塊記憶體主要是被JVM存放Class和Meta資訊的,Class在被Loader時就會被放到PermGen space中,
它和存放類例項(Instance)的Heap區域不同,GC(Garbage Collection)不會在主程式執行期對
PermGen space進行清理,所以如果你的應用中有很多CLASS的話,就很可能出現PermGen space錯誤,
這種錯誤常見在web伺服器對JSP進行pre compile的時候。如果你的WEB APP下都用了大量的第三方jar, 其大小
超過了jvm預設的大小(4M)那麼就會產生此錯誤資訊了。
解決方法: 手動設定MaxPermSize大小修改TOMCAT_HOME/bin/catalina.sh
在“echo "Using CATALINA_BASE:   $CATALINA_BASE"”上面加入以下行:
JAVA_OPTS="-server -XX:PermSize=64M -XX:MaxPermSize=128M"
建議:將相同的第三方jar檔案移置到tomcat/shared/lib目錄下,這樣可以達到減少jar 文件重複佔用記憶體的目的。二、java.lang.OutOfMemoryError: Java heap space
Heap size 設定
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值。
解決方法:手動設定Heap size
修改TOMCAT_HOME/bin/catalina.sh
在“echo "Using CATALINA_BASE:   $CATALINA_BASE"”上面加入以下行:
JAVA_OPTS="-server -Xms800m -Xmx800m   -XX:MaxNewSize=256m"三、例項,以下給出1G記憶體環境下java jvm 的引數設定參考:
JAVA_OPTS="-server -Xms800m -Xmx800m  -XX:PermSize=64M -XX:MaxNewSize=256m -XX:MaxPermSize=128m -Djava.awt.headless=true "

 
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%

  這一欄改為

rem ----- Execute The Requested Command
set JAVA_OPTS=-Xms512m -Xmx512m
echo Using CATALINA_BASE: %CATALINA_BASE%
echo Using CATALINA_HOME: %CATALINA_HOME%
echo Using CATALINA_TMPDIR: %CATALINA_TMPDIR%
echo Using JAVA_HOME: %JAVA_HOME%

  就可以將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"
--StartClass org.apache.catalina.startup.Bootstrap --StopClass org.apache.catalina.startup.Bootstrap
--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

  修改後:

"%EXECUTABLE%" //US//%SERVICE_NAME% --JvmOptions
"-Xms128M; -Xmx256M; -Dcatalina.base=%CATALINA_BASE%; -Dcatalina.home=%CATALINA_HOME%; -Djava.endorsed.dirs=%CATALINA_HOME%commonendorsed"
--StartMode jvm --StopMode jvm

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