1、記憶體優化:
優化記憶體,主要是在bin/catalina.bat或bin/catalina.sh 配置檔案中進行。linux上,在catalina.sh中添加:
其中:
1)錯誤提示:java.lang.OutOfMemoryError:Java heap space
Tomcat預設可以使用的記憶體為128MB,在較大型的應用項目中,這點記憶體是不夠的,有可能導緻系統無法運作。常見的問題是報Tomcat記憶體溢出錯誤,Outof Memory(系統記憶體不足)的異常,進而導緻用戶端顯示500錯誤,一般調整Tomcat的-Xms和-Xmx即可解決問題,通常将-Xms和-Xmx設定成一樣,堆的最大值設定為實體可用記憶體的最大值的80%。
2)錯誤提示:java.lang.OutOfMemoryError: PermGenspace
PermGenspace的全稱是Permanent Generationspace,是指記憶體的永久儲存區域,這塊記憶體主要是被JVM存放Class和Meta資訊的,Class在被Loader時就會被放到PermGenspace中,它和存放類執行個體(Instance)的Heap區域不同,GC(Garbage Collection)不會在主程式運作期對PermGenspace進行清理,是以如果你的應用中有很CLASS的話,就很可能出現PermGen space錯誤,這種錯誤常見在web伺服器對JSP進行precompile的時候。如果你的WEB APP下都用了大量的第三方jar, 其大小超過了jvm預設的大小(4M)那麼就會産生此錯誤資訊了。解決方法:
3)在使用-Xms和-Xmx調整tomcat的堆大小時,還需要考慮垃圾回收機制。如果系統花費很多的時間收集垃圾,請減小堆大小。一次完全的垃圾收集應該不超過3-5 秒。如果垃圾收內建為瓶頸,那麼需要指定代的大小,檢查垃圾收集的詳細輸出,研究垃圾收集參數對性能的影響。一般說來,你應該使用實體記憶體的 80% 作為堆大小。當增加處理器時,記得增加記憶體,因為配置設定可以并行進行,而垃圾收集不是并行的。
2、連接配接數優化:
#優化連接配接數,主要是在conf/server.xml配置檔案中進行修改。
2.1、優化線程數
找到Connectorport="8080" protocol="HTTP/1.1",增加maxThreads和acceptCount屬性(使acceptCount大于等于maxThreads),如下:
2.2、使用線程池
在server.xml中增加executor節點,然後配置connector的executor屬性,如下:
注:當tomcat并發使用者量大的時候,單個jvm程序确實可能打開過多的檔案句柄,這時會報java.net.SocketException:Too many open files錯誤。可使用下面步驟檢查:
3、Tomcat Connector三種運作模式(BIO, NIO,APR)
3.1、三種模式比較:
1)BIO:一個線程處理一個請求。缺點:并發量高時,線程數較多,浪費資源。Tomcat7或以下在Linux系統中預設使用這種方式。
2)NIO:利用Java的異步IO處理,可以通過少量的線程處理大量的請求。Tomcat8在Linux系統中預設使用這種方式。Tomcat7必須修改Connector配置來啟動(conf/server.xml配置檔案):
3)APR(Apache Portable Runtime):從作業系統層面解決io阻塞問題。Linux如果安裝了apr和native,Tomcat直接啟動就支援apr。
3.2、apr模式
安裝apr以及tomcat-native
進入tomcat/bin目錄,比如:
#注意最新版本的tomcat自帶tomcat-native.war.gz,不過其版本相對于yum安裝的apr過高,configure的時候會報錯。
解決:yum remove apr apr-devel –y,解除安裝yum安裝的apr和apr-devel,下載下傳最新版本的apr源碼包,編譯安裝;或者下載下傳低版本的tomcat-native編譯安裝
安裝成功後還需要對tomcat設定環境變量,方法是在catalina.sh檔案中增加1行:
#apr下載下傳位址:http://apr.apache.org/download.cgi
#tomcat-native下載下傳位址:http://tomcat.apache.org/download-native.cgi
修改8080端對應的conf/server.xml
protocol="org.apache.coyote.http11.Http11AprProtocol"
PS:啟動以後檢視日志 顯示如下表示開啟 apr 模式