tomcat性能調(diào)優(yōu)

tomcat通常是作為開發(fā)環(huán)境的容器,其配置也默認(rèn)是開發(fā)環(huán)境的,在性能提升方面還有很大空間。

本文主要從三個方面介紹一下tomcat性能調(diào)優(yōu):內(nèi)存,線程數(shù),IO。

一、內(nèi)存優(yōu)化(JVM內(nèi)存優(yōu)化)

主要是設(shè)定虛擬機(jī)的server啟動方式,以及堆內(nèi)存的初始分配大小,垃圾收集機(jī)制,線程最大堆棧配置數(shù),新生代內(nèi)存大小等等

a.JVM Server模式與client模式啟動,最主要的差別在于:-Server模式啟動時,速度較慢,但是一旦運行起來后,性能將會有很大的提升。JVM如果不顯式指定是-Server模式還是-client模式,JVM能夠根據(jù)下列原則進(jìn)行自動判斷(適用于Java5版本或者Java以上版本):根據(jù)是至少2個CPU和最低2GB內(nèi)存。

用java -version命令也可以查看JVM的運行模式

b.線程堆棧 -Xss 1024K 可以根據(jù)業(yè)務(wù)服務(wù)器的每次請求的大小來進(jìn)行分配

c.-xms -xmx? 是 jvm占用最小和最大物理內(nèi)存配置參數(shù),一般講兩者配置一樣大,這樣就免去了內(nèi)存不夠用時申請內(nèi)存的耗時;

d.-XX:PermSize=128M -XX:MaxPermSize=128m

?jvm的內(nèi)存分為2大類型,一個是perm型,另一個是generation型。perm區(qū)域存放的是class這些靜態(tài)信息,一般默認(rèn)64m,如果你的項目很大,有可能一啟動就報錯,out of memory permsize什么的,另外如果用spring框架的話很多類是動態(tài)反射加載的,運行一段時間有可能出現(xiàn)此異常,這種情況,設(shè)置下permsize就可以了。

另外一個類型才是重點,應(yīng)用的代碼基本上在這個區(qū)域活動,new的類都會在這個區(qū)域,而且jvm決大部分工作都在這里搞了,這個區(qū)包含新生代和老生代區(qū)域,所有new出來的會放置在新區(qū)域,而多次回收失敗的一些一直被使用的實例則被轉(zhuǎn)移到老生代區(qū)域,所以新生代區(qū)域活動是最頻繁的。新生代內(nèi)存不足時會促發(fā)一次 這個區(qū)的gc ----然后再到老生代的gc---最后才輪到full gc。full gc代價很高,應(yīng)該盡量避免,盡量在newsize參數(shù)的這個區(qū)gc,一般配置newsize分配到總內(nèi)存1/4左右,最終,如果full gc 還是內(nèi)存不足,那就會引發(fā)out of memory

二、線程優(yōu)化

tomcat線程優(yōu)化是在server.xml中,如:

<Connector port="80" protocol="HTTP/1.1" maxThreads="600" minSpareThreads="100" maxSpareThreads="500" acceptCount="700" connectionTimeout="20000">

maxThreads:服務(wù)器能處理并發(fā)請求的最大線程數(shù),默認(rèn)為200

acceptCount:當(dāng)maxThreads達(dá)到指定值時,接受排隊請求的個數(shù),默認(rèn)為100,超過設(shè)置的值,不予處理。

maxSpareThreads:最多有多少線程,超過這個數(shù)值,則關(guān)閉不在使用的線程

minSpareThreads:tomcat啟動時初始化創(chuàng)建的線程數(shù)

這些參數(shù)的設(shè)置,是需要具體業(yè)務(wù)具體硬件資源進(jìn)行配置的,像maxThreads這個參數(shù),也不是越大越好。在CPU核數(shù)較少的機(jī)器上,設(shè)置線程數(shù)較大的話,資源會消耗在線程之間切換上,單個請求的響應(yīng)會變得很慢。

三、IO優(yōu)化

需要先了解JAVA ?BIO/JAVA NIO/JAVA AIO這三個概念

JAVA? BIO:同步并阻塞IO,一個連接為一個線程,資源浪費嚴(yán)重,可通過線程池優(yōu)化。java1.4之前只有這一種方式。

JAVA? NIO:同步非阻塞IO.與BIO最大的區(qū)別one request one thread.可以復(fù)用同一個線程處理多個connection(多路復(fù)用)。java1.4之后引入。

JAVA? AIO,異步非阻塞IO(Java NIO2又叫AIO),多用于連接數(shù)目多且連接比較長(重操作)的架構(gòu),比如相冊服務(wù)器,充分調(diào)用OS參與并發(fā)操作,編程比較復(fù)雜,JDK7開始支持

在tomcat7或以下,默認(rèn)使用BIO方式,并發(fā)數(shù)多的情況下,線程數(shù)也較多,資源浪費嚴(yán)重。如果需要切換到NIO,則需要修改Connector配置:

<Connector port="80" protocol="org.apache.coyote.http11.Http11NioProtocol"

connectionTimeout="20000" redirectPort="8443">

tomcat8則默認(rèn)使用NIO方式,不需要修改。

還有要提一下APR(Apache Portable Runtime),簡單理解,就是從操作系統(tǒng)級別解決異步IO問題,大幅度的提高服務(wù)器的處理和響應(yīng)性能, 也是Tomcat運行高并發(fā)應(yīng)用的首選模式。此種方式需要安裝一些依賴庫。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容