1. 程式人生 > >tomcat的配置和優化

tomcat的配置和優化

tomcat的記憶體使用配置,最大連線數配置。

如何修改配置呢,在/tomcat的/bin/下面有個指令碼檔案catailna.sh。 如果 windows 是bat設定tomcat的使用記憶體,其實就是設定jvm的使用引數。

一.Tomcat記憶體優化

Tomcat記憶體優化主要是對 tomcat 啟動引數優化,我們可以在 tomcat 的啟動指令碼 catalina.sh 中設定 JAVA_OPTS 引數。

1.JAVA_OPTS引數說明

Java程式碼

 -server  啟用jdk 的 server 版;
 -Xms      java虛擬機器初始化時的最小記憶體;
 -Xmx      java虛擬機器可使用的最大記憶體;
 -XX:PermSize    記憶體永久保留區域
 -XX:MaxPermSize   記憶體最大永久保留區域

設定Tomcat啟動的初始記憶體,其初始空間(即-Xms)是實體記憶體的1/64,最大空間(-Xmx)是實體記憶體的1/4。可以利用JVM提供的-Xmn -Xms -Xmx等選項,要加“m”說明是MB,否則就是KB了,在啟動tomcat時會報記憶體不足。

 -Xms:初始值  【初始化記憶體大小】
-Xmx:最大值  【可以使用的最大記憶體】
-Xmn:最小值
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值。 這兩個值的大小一般根據需要進行設定。初始化堆的大小執行了虛擬機器在啟動時向系統申請的記憶體的大小。一般而言,這個引數不重要。但是有的應用 程式在大負載的情況下會急劇地佔用更多的記憶體,此時這個引數就是顯得非常重要,如果虛擬機器啟動時設定使用的記憶體比較小而在這種情況下有許多物件進行初始 化,虛擬機器就必須重複地增加記憶體來滿足使用。由於這種原因,我們一般把-Xms和-Xmx設為一樣大,而堆的最大值受限於系統使用的實體記憶體。一般使用數 據量較大的應用程式會使用持久物件,記憶體使用有可能迅速地增長。當應用程式需要的記憶體超出堆的最大值時虛擬機器就會提示記憶體溢位,並且導致應用服務崩潰。因 此一般建議堆的最大值設定為可用記憶體的最大值的80%。

  • 如果系統花費很多的時間收集垃圾,請減小堆大小。一次完全的垃圾收集應該不超過 3-5 秒。如果垃圾收整合為瓶頸,那麼需要指定代的大小,檢查垃圾收集的詳細輸出,研究 垃圾收集引數對效能的影響。一般說來,你應該使用實體記憶體的 80% 作為堆大小。當增加處理器時,記得增加記憶體,因為分配可以並行進行,而垃圾收集不是並行的。

  • 在重啟你的Tomcat伺服器之後,這些配置的更改才會有效。

Windows在檔案{tomcathome}/bin/catalina.bat,Unix在檔案{tomcathome}/bin/catalina.sh的前面,增加如下設定:

伺服器引數配置
tomcat預設: -Xms1024m -Xmx1024m -Xss1024K -XX:PermSize=128m -XX:MaxPermSize=256m

Java_OPTS引數

JAVA_OPTS="-Djava.awt.headless=true -Dfile.encoding=UTF-8
-server -Xms2048m -Xmx2048m
-XX:NewSize=512m -XX:MaxNewSize=512m -XX:PermSize=512m
-XX:MaxPermSize=512m -XX:+DisableExplicitGC"

配置完成後可重啟Tomcat ,通過以下命令進行檢視配置是否生效:

1.首先檢視Tomcat 程序號:

ps -ef | grep tomcat

我們可以看到Tomcat 程序號是 9217 

1.檢視是否配置生效:

sudo jmap –heap 9217

我們可以看到MaxHeapSize 等引數已經生效。

二.Tomcat併發優化

1.Tomcat連線相關引數

在Tomcat配置檔案conf下面 server.xml 中的配置中和連線數相關的引數有:

minProcessors:最小空閒連線執行緒數,用於提高系統處理效能,預設值為10
maxProcessors:最大連線執行緒數,即:併發處理的最大請求數,預設值為75
acceptCount:允許的最大連線數,應大於等於maxProcessors,預設值為100
enableLookups:是否反查域名,取值為:true或false。為了提高處理能力,應設定為false
connectionTimeout:網路連線超時,單位:毫秒。設定為0表示永不超時,這樣設定有隱患的。通常可設定為30000毫秒。

1.引數說明 
預設的tomcat 引數:

<Connector port=“8080" protocol="HTTP/1.1"
           connectionTimeout="20000"
           redirectPort="8443" />

修改:

<Connector port=“8080" protocol="org.apache.coyote.http11.Http11NioProtocol"
  maxThreads="600"
  minSpareThreads="100"
  maxSpareThreads="500"
  acceptCount="700"
  connectionTimeout="20000"
  redirectPort="8443" />

這樣設定以後,基本上沒有再當機過。

protocol="org.apache.coyote.http11.Http11NioProtocol" ///使用java的非同步io護理技術,no blocking IO
maxThreads=“600" 表示最多同時處理600個連線 ///最大執行緒數
minSpareThreads=“100" 表示即使沒有人使用也開這麼多空執行緒等待  ///初始化時建立的執行緒數
maxSpareThreads=“500" 表示如果最多可以空500個執行緒,例如某時刻有505人訪問,之後沒有人訪問了,則tomcat不會保留505個空執行緒,而是關閉505個空的。   ///一旦建立的執行緒超過這個值,Tomcat就會關閉不再需要的socket執行緒。
acceptCount="700"//指定當所有可以使用的處理請求的執行緒數都被使用時,可以放到處理佇列中的請求數,超過這個數的請求將不予處理

這裡是http connector的優化,如果使用apache和tomcat做叢集的負載均衡,並且使用ajp協議做apache和tomcat的協議轉發,那麼還需要優化ajp connector。

<Connector port="8009" protocol="AJP/1.3" maxThreads="600" minSpareThreads="100" maxSpareThreads="500" acceptCount="700" connectionTimeout="20000" redirectPort="8443" />

解決常遇到的一些報錯

一、Tomcat的JVM提示記憶體溢位

檢視%TOMCAT_HOME%\logs資料夾下,日誌檔案是否有記憶體溢位錯誤

二、修改Tomcat的JVM

1、錯誤提示:java.lang.OutOfMemoryError: Java heap space

Tomcat預設可以使用的記憶體為128MB,在較大型的應用專案中,這點記憶體是不夠的,有可能導致系統無法執行。常見的問題是報Tomcat記憶體溢位錯誤,Out of Memory(系統記憶體不足)的異常,從而導致客戶端顯示500錯誤,一般調整Tomcat的使用記憶體即可解決此問題。

windows環境下修改

“%TOMCAT_HOME%\bin\catalina.bat”檔案,在檔案開頭增加如下設定:JAVA_OPTS=-Xms2048m -Xmx2048m

Linux環境下修改

“%TOMCAT_HOME%\bin\catalina.sh”檔案,在檔案開頭增加如下設定:JAVA_OPTS=-Xms2048m -Xmx2048m

其中,-Xms設定初始化記憶體大小,-Xmx設定可以使用的最大記憶體。

跟我上面那麼設定就可以了。

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)那麼就會產生此錯誤資訊了。

解決方法:

在catalina.bat的第一行增加:

set JAVA_OPTS=-Xms64m -Xmx256m -XX:PermSize=128M -XX:MaxNewSize=256m - XX:MaxPermSize=256m

在catalina.sh的第一行增加:

JAVA_OPTS=-Xms64m -Xmx256m -XX:PermSize=128M -XX:MaxNewSize=256m  XX:MaxPermSize=256m
三、檢視Tomcat的JVM記憶體
  1. Tomcat6中沒有設定任何預設使用者,因而需要手動往Tomcat6的conf資料夾下的tomcat-users.xml檔案中新增使用者。 如:

    <role rolename="manager"/>
      <user username="tomcat" password="tomcat" roles="manager"/>

注:新增完需要重啟Tomcat6。

  1. 訪問http://localhost:8080/manager/status,輸入上面新增的使用者名稱和密碼。

  2. 然後在如下面的JVM下可以看到記憶體的使用情況。

tomcat的記憶體使用配置,最大連線數配置。

如何修改配置呢,在/tomcat的/bin/下面有個指令碼檔案catailna.sh。 如果 windows 是bat設定tomcat的使用記憶體,其實就是設定jvm的使用引數。

一.Tomcat記憶體優化

Tomcat記憶體優化主要是對 tomcat 啟動引數優化,我們可以在 tomcat 的啟動指令碼 catalina.sh 中設定 JAVA_OPTS 引數。

1.JAVA_OPTS引數說明

Java程式碼

 -server  啟用jdk 的 server 版;
 -Xms      java虛擬機器初始化時的最小記憶體;
 -Xmx      java虛擬機器可使用的最大記憶體;
 -XX:PermSize    記憶體永久保留區域
 -XX:MaxPermSize   記憶體最大永久保留區域

設定Tomcat啟動的初始記憶體,其初始空間(即-Xms)是實體記憶體的1/64,最大空間(-Xmx)是實體記憶體的1/4。可以利用JVM提供的-Xmn -Xms -Xmx等選項,要加“m”說明是MB,否則就是KB了,在啟動tomcat時會報記憶體不足。

 -Xms:初始值  【初始化記憶體大小】
-Xmx:最大值  【可以使用的最大記憶體】
-Xmn:最小值
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值。 這兩個值的大小一般根據需要進行設定。初始化堆的大小執行了虛擬機器在啟動時向系統申請的記憶體的大小。一般而言,這個引數不重要。但是有的應用 程式在大負載的情況下會急劇地佔用更多的記憶體,此時這個引數就是顯得非常重要,如果虛擬機器啟動時設定使用的記憶體比較小而在這種情況下有許多物件進行初始 化,虛擬機器就必須重複地增加記憶體來滿足使用。由於這種原因,我們一般把-Xms和-Xmx設為一樣大,而堆的最大值受限於系統使用的實體記憶體。一般使用數 據量較大的應用程式會使用持久物件,記憶體使用有可能迅速地增長。當應用程式需要的記憶體超出堆的最大值時虛擬機器就會提示記憶體溢位,並且導致應用服務崩潰。因 此一般建議堆的最大值設定為可用記憶體的最大值的80%。

  • 如果系統花費很多的時間收集垃圾,請減小堆大小。一次完全的垃圾收集應該不超過 3-5 秒。如果垃圾收整合為瓶頸,那麼需要指定代的大小,檢查垃圾收集的詳細輸出,研究 垃圾收集引數對效能的影響。一般說來,你應該使用實體記憶體的 80% 作為堆大小。當增加處理器時,記得增加記憶體,因為分配可以並行進行,而垃圾收集不是並行的。

  • 在重啟你的Tomcat伺服器之後,這些配置的更改才會有效。

Windows在檔案{tomcathome}/bin/catalina.bat,Unix在檔案{tomcathome}/bin/catalina.sh的前面,增加如下設定:

伺服器引數配置
tomcat預設: -Xms1024m -Xmx1024m -Xss1024K -XX:PermSize=128m -XX:MaxPermSize=256m

Java_OPTS引數

JAVA_OPTS="-Djava.awt.headless=true -Dfile.encoding=UTF-8
-server -Xms2048m -Xmx2048m
-XX:NewSize=512m -XX:MaxNewSize=512m -XX:PermSize=512m
-XX:MaxPermSize=512m -XX:+DisableExplicitGC"

配置完成後可重啟Tomcat ,通過以下命令進行檢視配置是否生效:

1.首先檢視Tomcat 程序號:

ps -ef | grep tomcat

我們可以看到Tomcat 程序號是 9217 

1.檢視是否配置生效:

sudo jmap –heap 9217

我們可以看到MaxHeapSize 等引數已經生效。

二.Tomcat併發優化

1.Tomcat連線相關引數

在Tomcat配置檔案conf下面 server.xml 中的配置中和連線數相關的引數有:

minProcessors:最小空閒連線執行緒數,用於提高系統處理效能,預設值為10
maxProcessors:最大連線執行緒數,即:併發處理的最大請求數,預設值為75
acceptCount:允許的最大連線數,應大於等於maxProcessors,預設值為100
enableLookups:是否反查域名,取值為:true或false。為了提高處理能力,應設定為false
connectionTimeout:網路連線超時,單位:毫秒。設定為0表示永不超時,這樣設定有隱患的。通常可設定為30000毫秒。

1.引數說明 
預設的tomcat 引數:

<Connector port=“8080" protocol="HTTP/1.1"
           connectionTimeout="20000"
           redirectPort="8443" />

修改:

<Connector port=“8080" protocol="org.apache.coyote.http11.Http11NioProtocol"
  maxThreads="600"
  minSpareThreads="100"
  maxSpareThreads="500"
  acceptCount="700"
  connectionTimeout="20000"
  redirectPort="8443" />

這樣設定以後,基本上沒有再當機過。

protocol="org.apache.coyote.http11.Http11NioProtocol" ///使用java的非同步io護理技術,no blocking IO
maxThreads=“600" 表示最多同時處理600個連線 ///最大執行緒數
minSpareThreads=“100" 表示即使沒有人使用也開這麼多空執行緒等待  ///初始化時建立的執行緒數
maxSpareThreads=“500" 表示如果最多可以空500個執行緒,例如某時刻有505人訪問,之後沒有人訪問了,則tomcat不會保留505個空執行緒,而是關閉505個空的。   ///一旦建立的執行緒超過這個值,Tomcat就會關閉不再需要的socket執行緒。
acceptCount="700"//指定當所有可以使用的處理請求的執行緒數都被使用時,可以放到處理佇列中的請求數,超過這個數的請求將不予處理

這裡是http connector的優化,如果使用apache和tomcat做叢集的負載均衡,並且使用ajp協議做apache和tomcat的協議轉發,那麼還需要優化ajp connector。

<Connector port="8009" protocol="AJP/1.3" maxThreads="600" minSpareThreads="100" maxSpareThreads="500" acceptCount="700" connectionTimeout="20000" redirectPort="8443" />

解決常遇到的一些報錯

一、Tomcat的JVM提示記憶體溢位

檢視%TOMCAT_HOME%\logs資料夾下,日誌檔案是否有記憶體溢位錯誤

二、修改Tomcat的JVM

1、錯誤提示:java.lang.OutOfMemoryError: Java heap space

Tomcat預設可以使用的記憶體為128MB,在較大型的應用專案中,這點記憶體是不夠的,有可能導致系統無法執行。常見的問題是報Tomcat記憶體溢位錯誤,Out of Memory(系統記憶體不足)的異常,從而導致客戶端顯示500錯誤,一般調整Tomcat的使用記憶體即可解決此問題。

windows環境下修改

“%TOMCAT_HOME%\bin\catalina.bat”檔案,在檔案開頭增加如下設定:JAVA_OPTS=-Xms2048m -Xmx2048m

Linux環境下修改

“%TOMCAT_HOME%\bin\catalina.sh”檔案,在檔案開頭增加如下設定:JAVA_OPTS=-Xms2048m -Xmx2048m

其中,-Xms設定初始化記憶體大小,-Xmx設定可以使用的最大記憶體。

跟我上面那麼設定就可以了。

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)那麼就會產生此錯誤資訊了。

解決方法:

在catalina.bat的第一行增加:

set JAVA_OPTS=-Xms64m -Xmx256m -XX:PermSize=128M -XX:MaxNewSize=256m - XX:MaxPermSize=256m

在catalina.sh的第一行增加:

JAVA_OPTS=-Xms64m -Xmx256m -XX:PermSize=128M -XX:MaxNewSize=256m  XX:MaxPermSize=256m
三、檢視Tomcat的JVM記憶體
  1. Tomcat6中沒有設定任何預設使用者,因而需要手動往Tomcat6的conf資料夾下的tomcat-users.xml檔案中新增使用者。 如:

    <role rolename="manager"/>
      <user username="tomcat" password="tomcat" roles="manager"/>

注:新增完需要重啟Tomcat6。

  1. 訪問http://localhost:8080/manager/status,輸入上面新增的使用者名稱和密碼。

  2. 然後在如下面的JVM下可以看到記憶體的使用情況。