天天看點

記憶體溢出之Tomcat記憶體配置

設定tomcat啟動的初始記憶體其初始空間(即-xms)是實體記憶體的1/64,最大空間(-xmx)是實體記憶體的1/4。

可以利用jvm提供的-xmn -xms -xmx等選項可進行設定

三、執行個體,以下給出1g記憶體環境下java jvm 的參數設定參考:

java_opts="-server -xms800m -xmx800m -xx:permsize=64m -xx:maxnewsize=256m -xx:maxpermsize=128m -djava.awt.headless=true " java_opts="-server -xms768m -xmx768m -xx:permsize=128m -xx:maxpermsize=256m -xx: newsize=192m -xx:maxnewsize=384m" catalina_opts="-server -xms768m -xmx768m -xx:permsize=128m -xx:maxpermsize=256m -xx:newsize=192m -xx:maxnewsize=384m"

linux:

在/usr/local/apache-tomcat-5.5.23/bin 目錄下的catalina.sh添加: java_opts='-xms512m -xmx1024m'要加“m”說明是mb,否則就是kb了,在啟動tomcat時會 報記憶體不足。 -xms:初始值-xmx:最大值-xmn:最小值

windows

在catalina.bat最前面加入set java_opts=-xms128m -xmx350m 如果用startup.bat啟動tomcat,ok設定生效.夠成功的配置設定200m記憶體. 但是如果不是執行startup.bat啟動tomcat而是利用windows的系統服務啟動tomcat服務,上面的設定就不生效了,就是說set java_opts=-xms128m -xmx350m 沒起作用.上面配置設定200m記憶體就oom了..

windows服務執行的是bin\tomcat.exe.他讀取系統資料庫中的值,而不是catalina.bat的設定.

解決辦法:

修改系統資料庫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加入 -xms300m -xmx350m 重起tomcat服務,設定生效

答案2tomcat 的jvm 記憶體溢出問題的解決關鍵字: tomcat 的jvm 記憶體溢出問題的解決

最近在熟悉一個開發了有幾年的項目,需要把資料庫從mysql移植到oracle,首先把jdbc的連接配接指向mysql,打包放到tomcat裡面,可以跑起來,沒有問題,可是當把jdbc連接配接指向oracle的時候,tomcat就連續抛java.lang.outofmemoryerror的錯誤,上網google了一下,了解了一下tomcat的運作機制,也解決了問題,share出來,以備查。

1、首先是: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.bat,在“echo "using catalina_base: $catalina_base"”上面加入以下行: java代碼 set java_opts=%java_opts% -server -xms800m -xmx800m -xx:maxnewsize=256m set java_opts=%java_opts% -server -xms800m

-xmx800m -xx:maxnewsize=256m 或修改catalina.sh 在“echo "using catalina_base: $catalina_base"”上面加入以下行: java_opts="$java_opts -server -xms800m -xmx800m -xx:maxnewsize=256m"

2、其次是: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)那麼就會産生此錯誤資訊了。

解決方法: 1. 手動設定maxpermsize大小 修改tomcat_home/bin/catalina.bat(linux下為catalina.sh),在java代碼 “echo "using catalina_base: $catalina_base"”上面加入以下行: set java_opts=%java_opts% -server -xx:permsize=128m -xx:maxpermsize=512m “echo "using

catalina_base: $catalina_base"”上面加入以下行: set java_opts=%java_opts% -server -xx:permsize=128m -xx:maxpermsize=512m catalina.sh下為: java代碼 java_opts="$java_opts -server -xx:permsize=128m -xx:maxpermsize=512m" java_opts="$java_opts -server -xx:permsize=128m -xx:maxpermsize=512m"

另外看到了另外一個文章,覺得挺好,摘抄如下:

分析java.lang.outofmemoryerror: permgen space 發現很多人把問題歸因于: spring,hibernate,tomcat,因為他們動态産生類,導緻jvm中的permanent heap溢出 。然後解決方法衆說紛纭,有人說更新 tomcat版本到最新甚至幹脆不用tomcat。還有人懷疑spring的問題,在spring論壇上讨論很激烈,因為spring在aop時使用cblib會動态産生很多類。

但問題是為什麼這些王牌的開源會出現同一個問題呢,那麼是不是更基礎的原因呢?tomcat在q&a很隐晦的回答了這一點,我們知道這個問題,但這個問題是由一個更基礎的問題産生。 于是有人對更基礎的jvm做了檢查,發現了問題的關鍵。原來sun 的jvm把記憶體分了不同的區,其中一個就是permenter區用來存放用得非常多的類和類描述。本來sun設計的時候認為這個區域在jvm啟動的時候就固定了,但他沒有想到現在動态會用得這麼廣泛。而且這個區域有特殊的垃圾收回機制,現在的問題是動态加載類到這個區域後,gc根本沒辦法回收!

對于以上兩個問題,我的處理是:

在catalina.bat的第一行增加:

java代碼 :set java_opts=-xms64m -xmx256m -xx:permsize=128m -xx:maxnewsize=256m -xx:maxpermsize=256m 

在catalina.sh的第一行增加:

java代碼 :java_opts=-xms64m -xmx256m -xx:permsize=128m -xx:maxnewsize=256m -xx:maxpermsize=256m

上一篇: svn解決方案
下一篇: CDN 解決方案