tomcat 記憶體配置學習總結
阿新 • • 發佈:2019-01-25
修改 tomcat 記憶體
http://www.cnblogs.com/quietwalk/archive/2012/11/05/2755199.html在Jetty 的VM引數中設定:
-Xms256m -Xmx512m -XX:MaxNewSize=256m -XX:MaxPermSize=256m
在tomcat執行環境中設定:
window環境 startup.bat第一行
SET CATALINA_OPTS= -Xms256m -Xmx512m -XX:MaxNewSize=256m -XX:MaxPermSize=256m
linux環境在catalina.sh
在
"if [ $have_tty -eq 1 ]; then"之後增加
JAVA_OPTS="-server -Xms256m -Xmx1024m -XX:PermSize=128m -XX:MaxPermSize=256m"
1、對於安裝版的TOMCAT:
進入TOMCAT的安裝目錄下的bin目錄,雙擊tomcat6w.exe。點選Java選項卡,可設定初始化記憶體,最大記憶體,執行緒的記憶體大小。
初始化記憶體:如果機器的記憶體足夠大,可以直接將初始化記憶體設定為512M,如果機器記憶體較小可適當調小,對於運行了EJB的應用,最好不要低於128M。
最大記憶體:最大記憶體目前設定為512M.
執行緒記憶體大小:目前配置為1024KB,這也是JDK5.0後的預設配置。
對於容器下運行了多個WEB應用時,儘量將相同的JAR包轉移到TOMCAT的lib下,此外還需要在JAVA OPTIONS加上如下配置:
-XX:PermSize=16m
-XX:MaxPermSize=128m
此配置表示JAVA永久儲存區域(即不會被虛擬機器回收)初始大小為16M,最大為128M。
2、對於解壓版的TOMCAT:
如果是WINDOWS作業系統,修改catalina.bat檔案;否則修改catalina.sh檔案。只需要在檔案的頭部加上"set JAVA_OPTS=-Xms512m -Xmx512m -Xss1024k”,數值分別對應了初始化的最小記憶體,最大記憶體,執行緒記憶體大小。如果JDK的版本是5.0之後的,執行緒記憶體可以不用設定。
3、linux系統下修改方法
在/usr/local/apache-tomcat-5.5.23/bin目錄下的catalina.sh
新增:JAVA_OPTS=’-Xms512m -Xmx1024m’
要加“m”說明是MB,否則就是KB了,在啟動tomcat時會報記憶體不足。
-Xms:初始值
-Xmx:最大值
-Xmn:最小值
對於容器下運行了多個WEB應用時,儘量將相同的JAR包轉移到TOMCAT的lib下,此外還需要在JAVA OPTS後加上如下配置:
-XX:PermSize=16m -XX:MaxPermSize=128m
即為:JAVA_OPTS=’-Xms256m –Xmx512m -XX:PermSize=128m -XX:MaxPermSize=512m’
此配置表示JAVA永久儲存區域(即不會被虛擬機器回收)初始大小為16M,最大為128M。
修改記憶體後,可啟動TOMCAT,輸入http://127.0.0.1:8080,進入Status,會提示輸入登入的使用者名稱和密碼,使用者可以在conf/tomcat-user.xml中配置(配置完後需要重啟TOMCAT),
1
<?xmlversion='1.0'encoding='utf-8'?>
2
<tomcat-users>
3
<rolerolename="manager"/>
4
<userusername="tomcat"password="s3cret"roles="manager"/>
5
</tomcat-users>
登入後即可看到TOMCAT當前的空閒記憶體和最大記憶體。
tomcat報Exception in thread "http-8080-36" 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=128m -XX:MaxPermSize=256m”
建議:將相同的第三方jar檔案移置到tomcat/shared/lib目錄下,這樣可以達到減少jar 文件重複佔用記憶體的目的。
========
Tomcat記憶體設定詳解
Java記憶體溢位詳解
一、常見的Java記憶體溢位有以下三種:
1. java.lang.OutOfMemoryError: Java heap space ----JVM Heap(堆)溢位
JVM在啟動的時候會自動設定JVM Heap的值,其初始空間(即-Xms)是實體記憶體的1/64,最大空間(-Xmx)不可超過實體記憶體。
可以利用JVM提供的-Xmn -Xms -Xmx等選項可進行設定。Heap的大小是Young Generation 和Tenured Generaion 之和。
在JVM中如果98%的時間是用於GC,且可用的Heap size 不足2%的時候將丟擲此異常資訊。
解決方法:手動設定JVM Heap(堆)的大小。
2. java.lang.OutOfMemoryError: PermGen space ---- PermGen space溢位。
PermGen space的全稱是Permanent Generation space,是指記憶體的永久儲存區域。
為什麼會記憶體溢位,這是由於這塊記憶體主要是被JVM存放Class和Meta資訊的,Class在被Load的時候被放入PermGen space區域,它和存放Instance的Heap區域不同,sun的 GC不會在主程式執行期對PermGen space進行清理,所以如果你的APP會載入很多CLASS的話,就很可能出現PermGen space溢位。
解決方法: 手動設定MaxPermSize大小
3. java.lang.StackOverflowError ---- 棧溢位
棧溢位了,JVM依然是採用棧式的虛擬機器,這個和C和Pascal都是一樣的。函式的呼叫過程都體現在堆疊和退棧上了。
呼叫建構函式的 “層”太多了,以致於把棧區溢位了。
通常來講,一般棧區遠遠小於堆區的,因為函式呼叫過程往往不會多於上千層,而即便每個函式呼叫需要 1K的空間(這個大約相當於在一個C函式內聲明瞭256個int型別的變數),那麼棧區也不過是需要1MB的空間。通常棧的大小是1-2MB的。
通常遞迴也不要遞迴的層次過多,很容易溢位。
解決方法:修改程式。
二、解決方法
在生產環境中tomcat記憶體設定不好很容易出現jvm記憶體溢位。
1、 linux下的tomcat:
修改TOMCAT_HOME/bin/catalina.sh
位置cygwin=false前。
JAVA_OPTS="-server -Xms256m -Xmx512m -XX:PermSize=64M -XX:MaxPermSize=128m"
2、 如果tomcat 5 註冊成了windows服務,以services方式啟動的,則需要修改登錄檔中的相應鍵值。
修改登錄檔HKEY_LOCAL_MACHINE\SOFTWARE\Apache Software Foundation\Tomcat Service Manager\Tomcat5\Parameters\Java,右側的Options
原值為
-Dcatalina.home="C:\ApacheGroup\Tomcat 5.0"
-Djava.endorsed.dirs="C:\ApacheGroup\Tomcat 5.0\common\endorsed"
-Xrs
加入 -Xms256m -Xmx512m
重起tomcat服務,設定生效
3、如果tomcat 6 註冊成了windows服務,或者windows2003下用tomcat的安裝版,
在/bin/tomcat6w.exe裡修改就可以了 。
4、 如果要在myeclipse中啟動tomcat,上述的修改就不起作用了,可如下設定:
Myeclipse->preferences->myeclipse->servers->tomcat->tomcat×.×->JDK面板中的
Optional Java VM arguments中新增:-Xms256m -Xmx512m -XX:PermSize=64M -XX:MaxPermSize=128m
三、jvm引數說明:
-server:一定要作為第一個引數,在多個CPU時效能佳
-Xms:java Heap初始大小。 預設是實體記憶體的1/64。
-Xmx:java heap最大值。建議均設為實體記憶體的一半。不可超過實體記憶體。
-XX:PermSize:設定記憶體的永久儲存區初始大小,預設值為64M。(我用visualvm.exe檢視的)
-XX:MaxPermSize:設定記憶體的永久儲存區最大 大小,預設值為64M。(我用visualvm.exe檢視的)
-XX:SurvivorRatio=2 :生還者池的大小,預設是2,如果垃圾回收變成了瓶頸,您可以嘗試定製生成池設定
-XX:NewSize: 新生成的池的初始大小。 預設值為2M。
-XX:MaxNewSize: 新生成的池的最大大小。 預設值為32M。
如果 JVM 的堆大小大於 1GB,則應該使用值:-XX:newSize=640m -XX:MaxNewSize=640m -XX:SurvivorRatio=16,或者將堆的總大小的 50% 到 60% 分配給新生成的池。調大新物件區,減少Full GC次數。
+XX:AggressiveHeap 會使得 Xms沒有意義。這個引數讓jvm忽略Xmx引數,瘋狂地吃完一個G實體記憶體,再吃盡一個G的swap。
-Xss:每個執行緒的Stack大小,“-Xss 15120” 這使得JBoss每增加一個執行緒(thread)就會立即消耗15M記憶體,而最佳值應該是128K,預設值好像是512k.
-verbose:gc 現實垃圾收集資訊
-Xloggc:gc.log 指定垃圾收集日誌檔案
-Xmn:young generation的heap大小,一般設定為Xmx的3、4分之一
-XX:+UseParNewGC :縮短minor收集的時間
-XX:+UseConcMarkSweepGC :縮短major收集的時間 此選項在Heap Size 比較大而且Major收集時間較長的情況下使用更合適。
-XX:userParNewGC 可用來設定並行收集【多CPU】
-XX:ParallelGCThreads 可用來增加並行度【多CPU】
-XX:UseParallelGC 設定後可以使用並行清除收集器【多CPU】
========
TOMCAT記憶體溢位及大小調整
一、
tomcat記憶體設定問題
在使用Java程式從資料庫中查詢大量的資料或是應用伺服器(如tomcat、jboss,weblogic)載入jar包時會出現java.lang.OutOfMemoryError異常。這主要是由於應用伺服器的記憶體不足引起的。這種異常常有以下幾種情況(以下以tomcat環境為例,其它WEB伺服器如jboss,weblogic等是同一個道理):
1. java.lang.OutOfMemoryError: PermGen space
PermGen space的全稱是Permanent Generation space,是指記憶體的永久儲存區域OutOfMemoryError: PermGen space。從文字上看就是記憶體溢位,解決方法是加大記憶體。為什麼會記憶體溢位,這是由於這塊記憶體主要是被JVM存放Class和Meta資訊的,Class在被Load的時候被放入PermGen space區域,它和存放Instance的Heap區域不同,GC(Garbage Collection)不會在主程式執行期對PermGen space進行清理,所以如果你的APP會LOAD很多CLASS的話,就很可能出現PermGen space錯誤。這種錯誤常見在web伺服器對JSP進行pre compile的時候。如果你的WEB APP下都用了大量的第三方jar, 其大小超過了jvm預設的大小(4M)那麼就會產生此錯誤資訊了。
解決方法: 手動設定MaxPermSize大小
a.如果tomcat是以bat方式啟動的,則如下設定:
修改TOMCAT_HOME/bin/catalina.sh
在“echo "Using CATALINA_BASE: $CATALINA_BASE"”上面加入以下行:
JAVA_OPTS="-server -XX:PermSize=64M -XX:MaxPermSize=128m
b.如果tomcat是註冊成了windows服務,以services方式啟動的,則需要修改登錄檔中的相應鍵值。
開啟登錄檔,找到目錄HKEY_LOCAL_MACHINE\SOFTWARE\Apache Software Foundation\Procrun 2.0\htfty\Parameters\Java,其中目錄地址中紅色標註的(如htfty)需要根據不同情況作修改,為tomcat服務註冊成windows服務的名稱。 可以看到JvmMs和JvmMx項,其中JvmMs設定最小的記憶體使用引數,JvmMx設定最大的記憶體使用引數。設定好JvmMs和JvmMx項的值,重啟tomcat伺服器即可生效。
建議:將相同的第三方jar檔案移置到tomcat/shared/lib目錄下,這樣可以達到減少jar 文件重複佔用記憶體的目的。
2. java.lang.OutOfMemoryError: Java heap space
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
a.如果tomcat是以bat方式啟動的,則如下設定:
修改TOMCAT_HOME/bin/catalina.sh
在“echo "Using CATALINA_BASE: $CATALINA_BASE"”上面加入以下行:
JAVA_OPTS="-server -Xms800m -Xmx800m -XX:MaxNewSize=256m"
b.如果tomcat是註冊成了windows服務,以services方式啟動的,則需要修改登錄檔中的相應鍵值。
開啟登錄檔,找到目錄HKEY_LOCAL_MACHINE\SOFTWARE\Apache Software Foundation\Procrun 2.0\htfty\Parameters\Java,其中目錄地址中紅色標註的(如htfty)需要根據不同情況作修改,為tomcat服務註冊成windows服務的名稱。 可以看到JvmMs和JvmMx項,其中JvmMs設定最小的記憶體使用引數,JvmMx設定最大的記憶體使用引數。設定好JvmMs和JvmMx項的值,重啟tomcat伺服器即可生效。
提示:Heap Size 最大不要超過可用實體記憶體的80%,一般的要將-Xms和-Xmx選項設定為相同,而-Xmn為1/4的-Xmx值。
二、Tomcat本身不能直接在計算機上執行,需要依賴於硬體基礎之上的作業系統和一個java虛擬機器。JAVA程式啟動時JVM都會分配一個初始記憶體和最大記憶體給這個應用程式。這個初始記憶體和最大記憶體在一定程度都會影響程式的效能。比如說在應用程式用到最大記憶體的時候,JVM是要先去做垃圾回收的動作,釋放被佔用的一些記憶體。所以想調整Tomcat的啟動時初始記憶體和最大記憶體就需要向JVM宣告,一般的JAVA程式在執行都可以通過中-Xms -Xmx來調整應用程式的初始記憶體和最大記憶體: 這兩個值的大小一般根據需要進行設定。初始化堆的大小執行了虛擬機器在啟動時向系統申請的記憶體的大小。一般而言,這個引數不重要。但是有的應用程式在大負載的情況下會急劇地佔用更多的記憶體,此時這個引數就是顯得非常重要,如果虛擬機器啟動時設定使用的記憶體比較小而在這種情況下有許多物件進行初始化,虛擬機器就必須重複地增加記憶體來滿足使用。由於這種原因,我們一般把-Xms和-Xmx設為一樣大,而堆的最大值受限於系統使用的實體記憶體。一般使用資料量較大的應用程式會使用持久物件,記憶體使用有可能迅速地增長。當應用程式需要的記憶體超出堆的最大值時虛擬機器就會提示記憶體溢位,並且導致應用服務崩潰。因此一般建議堆的最大值設定為可用記憶體的最大值的80%。
Tomcat預設可以使用的記憶體為128MB,在較大型的應用專案中,這點記憶體是不夠的,需要調大。有以下幾種方法可以選用:
第一種方法:
Windows下,在檔案/bin/catalina.bat,Unix下,在檔案/bin/catalina.sh的前面,增加如下設定:
JAVA_OPTS='-Xms【初始化記憶體大小】 -Xmx【可以使用的最大記憶體】'
需要把這個兩個引數值調大。例如:
JAVA_OPTS='-Xms256m -Xmx512m'
表示初始化記憶體為256MB,可以使用的最大記憶體為512MB。
第二種方法: 環境變數中設 變數名:JAVA_OPTS 變數值:-Xms512m -Xmx512m
第三種方法:前兩種方法針對的是bin目錄下有catalina.bat的情況(比如直接解壓的Tomcat等),但是有些安裝版的Tomcat下沒有catalina.bat,這個時候可以採用如下方法,當然這個方法也是最通用的方法:開啟tomcatHome/\bin/\tomcat5w.exe,點選Java選項卡,然後將會發現其中有這麼兩項:Initial memory pool和Maximum memory pool.Initial memory pool這個就是初始化設定的記憶體的大小。Maximum memory pool這個是最大記憶體的大小 設定完了就按確定然後再重啟TOMCAT你就會發現tomcat中jvm可用的記憶體改變了
另外需要考慮的是Java提供的垃圾回收機制。虛擬機器的堆大小決定了虛擬機器花費在收集垃圾上的時間和頻度。收集垃圾可以接受的速度與應用有關,應該通過分析實際的垃圾收集的時間和頻率來調整。如果堆的大小很大,那麼完全垃圾收集就會很慢,但是頻度會降低。如果你把堆的大小和記憶體的需要一致,完全收集就很快,但是會更加頻繁。調整堆大小的的目的是最小化垃圾收集的時間,以在特定的時間內最大化處理客戶的請求。在基準測試的時候,為保證最好的效能,要把堆的大小設大,保證垃圾收集不在整個基準測試的過程中出現。 如果系統花費很多的時間收集垃圾,請減小堆大小。一次完全的垃圾收集應該不超過 3-5 秒。如果垃圾收整合為瓶頸,那麼需要指定代的大小,檢查垃圾收集的詳細輸出,研究 垃圾收集引數對效能的影響。一般說來,你應該使用實體記憶體的 80% 作為堆大小。當增加處理器時,記得增加記憶體,因為分配可以並行進行,而垃圾收集不是並行的。
一個要注意的地方:建議把記憶體的最高值跟最低值的差值縮小,不然會浪費很多記憶體的, 最低值加大 ,最高值可以隨便設,但是要根據實際的實體記憶體 ,如果記憶體設定太大了,比如設定了512M最大記憶體,但如果沒有512M可用記憶體,Tomcat就不能啟動,還有可能存在記憶體被系統回收,終止程序的情況
========
如何修改和檢視tomcat記憶體大小
為了解決tomcat在大進行大併發請求時,出現記憶體溢位的問題,請修改tomcat的記憶體大小,其中分為以下兩種方式:
一、使用 catalina.bat 等命令列方式執行的 tomcat
檢視系統最大支援記憶體命令:java -Xmx1024m -version
1、修改 tomcat\bin\Catalina.bat 檔案
windows環境下:
在166行左右
rem Execute Java with the applicable properties ”以下每行
%_EXECJAVA% %JAVA_OPTS% %CATALINA_OPTS% %DEBUG_OPTS% -Djava.endorsed.dirs="%JAVA_ENDORSED_DIRS%" -classpath "%CLASSPATH%" -Dcatalina.base="%CATALINA_BASE%" -Dcatalina.home="%CATALINA_HOME%" -Djava.io.tmpdir="%CATALINA_TMPDIR%" %MAINCLASS% %CMD_LINE_ARGS% %ACTION%
在 %DEBUG_OPTS% 後面新增-Xms256m -Xmx512m
linux環境下:
開啟在Tomcat的安裝目錄的bin檔案的catalina.sh檔案,進入編輯狀態.
在註釋後面加上如下指令碼:
JAVA_OPTS='-Xms512m -Xmx1024m'
JAVA_OPTS="$JAVA_OPTS -server -XX:PermSize=64M -XX:MaxPermSize=256m"
其中 JAVA_OPTS='-Xms512m -Xmx1024m' 是設定Tomcat使用的記憶體的大小.
-XX:PermSize=64M -XX:MaxPermSize=256m 指定類空間(用於載入類)的記憶體大小
儲存後,重新以命令列的方式執行 tomcat ,即可,然後通過最後面介紹的如何觀察tomcat現有記憶體情況的方法進行檢視是否已經變更成功。
二、使用 系統中的 “服務”,或者開始選單的可執行程式執行的tomcat
1、關閉 現在正在執行的tomcat
2.1 [注意]
[高版本tomcat配置方法]
如果是tomcat 5.5 或者是 5.0.28 之後的版本,在 Java 選項卡中,下方,會有
Inital memory Pool:
Maximum memory Pool:
Thread stack size:
三個輸入框,在這裡即可不用做上面的操作,直接配置記憶體大小,只需要設定
Inital memory Pool 為 256
Maximum memory Pool 為 512
點選確定後,重啟tomcat 生效
如果您是低版本的tomcat,發現沒有上面那幾個錄入框,請看下面的操作步驟
[低版本tomcat配置方法]
在開始選單中,找到“Apache Tomcat 5.0”,並選擇“Configure Tomcat”,在彈出的對話方塊視窗中,切換到 Java VM 選項卡,並在 Java Options 輸入框的最前面輸入
-Xms256m -Xmx512m
即輸入框中的內容會像下面的程式碼(與自己的環境有所區別)
-Xms256m -Xmx512m
-Dcatalina.home="C:\tomcat5"
-Djava.endorsed.dirs="C:\tomcat5\common\endorsed"
-Xrs
設定完後,點選“確定”,並重啟tomcat即可。
三、檢視現有tomcat的記憶體大小情況
1、啟動tomcat
2、訪問 http://localhost:8080/manager/status ,並輸入您在安裝tomcat時輸入的使用者與口令,如 admin ,密碼 admin(密碼是您在tomcat安裝時輸入的)
注:新增使用者,修改conf/tomcat-users.xml
<?xml version='1.0' encoding='utf-8'?>
<tomcat-users>
<role rolename="tomcat"/>
<role rolename="role1"/>
<role rolename="manager"/>
<role rolename="admin"/>
<user username="tomcat" password="tomcat" roles="tomcat"/>
<user username="both" password="tomcat" roles="tomcat,role1"/>
<user username="role1" password="tomcat" roles="role1"/>
<user username="admin" password="admin" roles="admin,manager"/>
</tomcat-users>
3、進入了Server Status頁面,可以在JVM表格中看到
Free memory: 241.80 MB Total memory: 254.06 MB Max memory: 508.06 MB
上面的文字即代表了,當前空閒記憶體、當前總記憶體、最大可使用記憶體三個資料。
確定了最大記憶體足夠大時,tomcat即可正常運轉
========
如何更改tomcat7及以上版本記憶體設定
http://jingyan.baidu.com/article/295430f1c22a940c7e0050fb.html當在tomcat的webapps資料夾中部署需要大量資源的war包時,啟動tomcat,war包將不能被成功部署。
tomcat安裝有services版安裝和開發版安裝。
本經驗將介紹如何設定兩種版本的tomcat需要使用的記憶體和perm 大小。
工具/原料
能夠開啟bat檔案或者sh檔案的編輯器
安裝tomcat
Services版本tomcat 記憶體和perm 設定
1
進入 {tomcat 安裝目錄}\bin 目錄下,i.e,C:\Tomcat 8.0\bin。 Services版本安裝下會有名字類似於Tomcat8w.exe 的檔案。如圖所示:
2
如何設定使用記憶體:
1. 雙擊tomcat8w.exe, Apache tomcat8 屬性框將開啟,選中Java tab。
2. 在初始化記憶體池和最大記憶體池中可以設定tomcat8所需要的記憶體。
本圖設定的值分別是512MB和1024MB。使用者根據自己的需求進行設定。
3
如何設定PermSize:
1. 雙擊tomcat8w.exe, Apache tomcat8 屬性框將開啟,選中Java tab。
2. 在Java Options框中輸入,如下格式的引數(數值大小根據需要設定,格式可以複製本經驗格式)
-XX:PermSize=256M-XX:MaxPermSize=1024M
開發版tomcat記憶體和perm size設定
1
進入 {tomcat 安裝目錄}\bin 目錄下,i.e,C:\Tomcat 8.0\bin, 目錄下會有catalina.bat檔案和catalina.sh檔案。 windows使用者用編輯器開啟catalina.bat, Linux使用者用編輯器開啟catalina.sh檔案。
2
在Catalina.bat檔案中找到如下行 所在的位置:
:noJuliConfig
set JAVA_OPTS=%JAVA_OPTS% %LOGGING_CONFIG%
3
設定記憶體引數:
在:noJuliConfig下面設定如下格式的引數:(數值可以更改,格式不能更改)
JAVA_OPTS='-Xms512m -Xmx1024m'
4
設定PermSize:
在:noJuliConfig下面設定如下格式的引數:(數值可以更改,格式不能更改)
JAVA_OPTS="$JAVA_OPTS -server -XX:PermSize=64M -XX:MaxPermSize=256m"
注意事項
格式安裝經驗中的格式書寫,不能擅自加入空格,否則設定可能會失效。
引數值大小根據實際需求設定,設定過小,web應用將不能成功部署。
經驗內容僅供參考,如果您需解決具體問題(尤其法律、醫學等領域),建議您詳細諮詢相關領域
========
記憶體溢位之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
========