Tomcat JVM、併發配置
一、JVM記憶體配置優化
在開發當中,當一個專案比較大時,依賴的jar包通常比較多,我們都知道,在應用伺服器啟動時,會將應用引用到的所有類通過ClassLoader依次全部載入到記憶體當中。Java的邏輯記憶體模型大致分為堆記憶體、棧記憶體、靜態記憶體區,也稱持久區,該區的記憶體不會被GC回收。堆記憶體用於儲存類的例項、陣列等引用型別資料,也就是用new生成的物件,都存放在這裡,棧記憶體儲存區域性變數(如:方法引數),靜態記憶體區儲存常量、靜態變數、類元資料資訊(方法、屬性等)。開發當中常遇到的三類記憶體溢位異常:
- java.lang.OutOfMemoryError: Java heap space異常
表示堆記憶體空間滿了,如果不是程式邏輯的bug,可能是因為專案中引用的jar比較多,導到記憶體溢位。JVM預設堆的最小使用記憶體為實體記憶體的1/64,最大使用記憶體為實體記憶體的1/4,如8G的實體記憶體,JVM預設堆的最小和最大記憶體分別為128m和2048m。通過調整JVM的-Xms(初始記憶體)和-Xmx(最大記憶體)兩個引數加大記憶體使用限制。 - java.lang.OutOfMemoryError: PermGen space異常
表示靜態記憶體區滿了,通常是由於載入的類過多導致。jdk8以下版本通過修改JVM的-XX:PermSize和-XX:MaxPermSize兩個引數,限制靜態區最小和最大記憶體範圍。jdk8改變了記憶體模型,將類定義存放到了元資料(MetaspaceSize)空間,而元資料空間是與堆空間共享同一塊記憶體區域的,所以在JDK8以後版本不會存在PermGen space異常了,故不用設定此引數。 - java.lang.StackOverflowError異常
表示棧記憶體溢位。通常是由於死迴圈、無限遞迴導致。
修改Tomcat的記憶體配置,開啟$TOMCAT_HOME/bin/catalina.sh檔案(Windows系統是catalina.bat檔案),大楖在250行左右,在JAVA_OPTS引數上新增記憶體引數設定即可。完整的JVM引數設定如下所
JAVA_OPTS="$JAVA_OPTS -server -Xms2048m -Xmx2048m -XX:PermSize=128m -XX:MaxPermSize=256 -Djava.awt.headless=true"
-server引數:表示以服務模式啟動,啟動速度會稍微慢一點,但效能會高很多。不加這個引數,預設是以客戶端模式啟動。
java.awt.headless=true引數:與圖形操作有關,適用於linux系統。如生成驗證碼,含義是當前使用的是沒有安裝圖安裝圖形介面的伺服器,應用中如果獲取系統顯示有關引數會拋異常,可通過jmap -heap proccess_id檢視設定是否成功。
二、併發配置優化
主要配置Tomcat能處理的請求數,當一個程序的執行緒數超過500個的話,那麼這個程序的執行效率就很低了。表面上看執行緒越多處理的請求越多,其實過多的執行緒會佔用CPU在不同執行緒之間切換的資源,導致CPU在每個執行緒上處理的時間片極期有限,反而會降低伺服器的響應效能。
<Connectorport="8080"protocol="org.apache.coyote.http11.Http11AprProtocol"
connectionTimeout="20000"
redirectPort="8443"
maxThreads="500"
minSpareThreads="100"
maxSpareThreads="200"
acceptCount="200"
maxIdleTime="30000"
enableLookups="false"
/>
Tomcat的併發請求處理數量=maxThreads + acceptCount
protocol:啟用APR連線模式,提高非同步IO處理效能。啟用配置請參考:《開啟Tomcat
APR執行模式,優化併發效能》
maxThreads:最大能接受的請求數,預設為200
minSpareThreads:最少備用執行緒數,預設初始化,預設為25
maxSpareThreads:最多備用執行緒數,一旦建立的執行緒超過這個值,Tomcat就會關閉不再需要的socket執行緒
acceptCount:等待處理的請求佇列,預設為100,超過佇列長度,伺服器則拒絕客戶端請求,直接返回403
maxIdleTime:如果一個執行緒在30秒以內沒有活躍,則終止執行並從執行緒池中移除。除非執行緒池數量小於或等於minSpareThreads數量。預設值是1分鐘
enableLookups:如果為true,呼叫request.getRemoteHost會執行DNS反查,反向解析IP對應的域名或主機,效率較低,建議設為false。
更多引數設定,請參考Tomcat官方文件:http://tomcat.apache.org/tomcat-8.0-doc/config/http.html
三、管理員配置
Tomcat預設沒有配置管理員帳戶的許可權,如果要檢視app的部署狀態、通過管理介面deploy或undeploy,則需要在tomcat-user.xml中配置具有管理許可權登入的使用者。
<role rolename="tomcat"/>
<role rolename="manager-gui"/>
<role rolename="manager-status"/>
<role rolename="manager-script"/>
<role rolename="manager-jmx"/>
<user
username="tomcat"
password="tomcat"
roles="tomcat,manager-gui,manager-status,manager-script,manager-jmx"/>