Tomcat優(yōu)化詳細(xì)教程驳庭,很詳細(xì),值得學(xué)習(xí)

原文地址:https://blog.csdn.net/Kally_Wang/article/details/74989885

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

? ? ? ? 默認(rèn)情況下Tomcat的相關(guān)內(nèi)存配置較低缔杉,這對(duì)于一些大型項(xiàng)目顯然是不夠用的,這些項(xiàng)目運(yùn)行就已經(jīng)耗費(fèi)了大部分內(nèi)存空間搁料,何況大規(guī)模訪問(wèn)的情況或详。即使是本文中的這個(gè)只有一個(gè)頁(yè)面的超小項(xiàng)目,在并發(fā)達(dá)到一定程度后也會(huì)拋出以下類似異常:

嚴(yán)重:?Exception?invoking?periodic?operation:?java.lang.OutOfMemoryError:?Java?heap?space????嚴(yán)重:?Error?processing?request?java.lang.OutOfMemoryError:?GC?overhead?limit?exceeded??

?說(shuō)明Tomcat已經(jīng)無(wú)力支持訪問(wèn)處理郭计,內(nèi)部GC也已經(jīng)“無(wú)能無(wú)力”霸琴。所以一般情況下我們需要重新配置Tomcat的相關(guān)內(nèi)存大小。

1.修改內(nèi)存等 JVM相關(guān)配置

Linux下修改TOMCAT_HOME/bin/catalina.sh拣宏,在其中加入沈贝,可以放在CLASSPATH=下面:

JAVA_OPTS="-server?-XX:PermSize=512M?-XX:MaxPermSize=1024m?-Xms2048m?-Xmx2048m"??

?windows下修改TOMCAT_HOME/bin/catalina.bat杠人,在其中加入勋乾,可以放在set CLASSPATH=下面:

set?JAVA_OPTS=-server?-XX:PermSize=512M?-XX:MaxPermSize=1024m?-Xms2048m?-Xmx2048m??

?這些參數(shù)在我們學(xué)習(xí)JVM部分文章時(shí)已經(jīng)都認(rèn)識(shí)過(guò)了宋下,不過(guò)這里還是簡(jiǎn)單介紹下:

? ? ? ??-server:?jiǎn)⒂?JDK的 server 版本;

-Xms:Java虛擬機(jī)初始化時(shí)堆的最小內(nèi)存辑莫,一般與 Xmx配置為相同值学歧,這樣的好處是GC不必再為擴(kuò)展內(nèi)存空間而消耗性能;

-Xmx:Java虛擬機(jī)可使用堆的最大內(nèi)存各吨;

? ? ? ??-XX:PermSize:Java虛擬機(jī)永久代大兄Ρ俊;

? ? ? ? -XX:MaxPermSize:Java虛擬機(jī)永久代大小最大值揭蜒;

? ? ? ? 除了這些參數(shù)外您還可以根據(jù)具體需要配置其他參數(shù)横浑,參數(shù)的配置可以參考JVM參數(shù)的配置

2.驗(yàn)證

? ? ? ? 設(shè)置成功后我們可以利用JDK自帶的工具進(jìn)行驗(yàn)證,這些工具都在JAVA_HOME/bin目錄下:

? ? ? ? 1)jps:用來(lái)顯示本地的java進(jìn)程屉更,以及進(jìn)程號(hào)徙融,進(jìn)程啟動(dòng)的路徑等。

2)jmap:觀察運(yùn)行中的JVM 物理內(nèi)存的占用情況瑰谜,包括Heap size , Perm size下載地址等欺冀。

? ? ? ? 進(jìn)入命令行模式后,進(jìn)入JAVA_HOME/bin目錄下萨脑,然后輸入jps命令:

jps??#顯示以下結(jié)果??

2340?Bootstrap??

6696?Jps??

其中 Bootstrap進(jìn)程就是我們啟動(dòng)了的 Tomcat隐轩,其進(jìn)程號(hào)為2340.

? ? ? ? 然后我們利用 jmap工具查看其內(nèi)存相關(guān)配置:

jmap?-heap?2340??#顯示以下結(jié)果??

Attaching?to?process?ID?2340,?please?wait...??

Debugger?attached?successfully.??

Server?compiler?detected.??

JVM?version?is?24.65-b04????

using?thread-local?object?allocation.??

Parallel?GC?with?4?thread(s)????

Heap?Configuration:?????

MinHeapFreeRatio?=?0?????

MaxHeapFreeRatio?=?100?????

MaxHeapSize??????=?2147483648?(2048.0MB)????//最大堆內(nèi)存?????

NewSize??????????=?1310720?(1.25MB)?????

MaxNewSize???????=?17592186044415?MB?????

OldSize??????????=?5439488?(5.1875MB)?????

NewRatio?????????=?2?????

SurvivorRatio????=?8?????

PermSize?????????=?536870912?(512.0MB)??????//永久代初始大小?????

MaxPermSize??????=?1073741824?(1024.0MB)????//永久代最大大小?????

G1HeapRegionSize?=?0?(0.0MB)??

Heap?Usage:??

PS?Young?Generation??Eden?Space:?????

capacity?=?537919488?(513.0MB)?????

used?????=?247606720?(236.13616943359375MB)?????

free?????=?290312768?(276.86383056640625MB)? ? ?46.03044238471613%?used??

From?Space:? ? ?

capacity?=?89128960?(85.0MB)? ? ?

used?????=?0?(0.0MB)? ? ?free?????=?89128960?(85.0MB)?????

0.0%?used??To?Space:?????

capacity?=?89128960?(85.0MB)?????

used?????=?0?(0.0MB)?????

free?????=?89128960?(85.0MB)?????

0.0%?used??PS?Old?Generation?????

capacity?=?1431830528?(1365.5MB)?????

used?????=?0?(0.0MB)?????

free?????=?1431830528?(1365.5MB)?????

0.0%?used??PS?Perm?Generation?????

capacity?=?536870912?(512.0MB)????

?used?????=?20770360?(19.80815887451172MB)?????

free?????=?516100552?(492.1918411254883MB)?????

3.86878103017807%?used????

12005?interned?Strings?occupying?1039352?bytes.?

從結(jié)果就可以看出我們的配置已經(jīng)成功了。

二渤早、配置優(yōu)化

? ? ? ? 我們知道TOMCAT_HOME/conf/server.xml可以配置端口职车,虛擬路徑等等 Tomcat相關(guān)主要配置。

1.Connector?優(yōu)化

? ? ? ??Connector是連接器鹊杖,負(fù)責(zé)接收客戶的請(qǐng)求提鸟,以及向客戶端回送響應(yīng)的消息。所以?Connector的優(yōu)化是重要部分仅淑。默認(rèn)情況下 Tomcat只支持200線程訪問(wèn)称勋,超過(guò)這個(gè)數(shù)量的連接將被等待甚至超時(shí)放棄,所以我們需要提高這方面的處理能力涯竟。

? ? ? ? 修改這部分配置需要修改TOMCAT_HOME/conf/server.xml赡鲜,打開(kāi)server.xml找到Connector 標(biāo)簽項(xiàng),默認(rèn)配置如下:

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

其中port代表服務(wù)接口庐船;protocol代表協(xié)議類型银酬;connectionTimeout代表連接超時(shí)時(shí)間,單位為毫秒筐钟;redirectPort代表安全通信(https)轉(zhuǎn)發(fā)端口揩瞪,一般配置成443。

? ? ? ? 可以看到除了這幾個(gè)基本配置外并無(wú)特殊功能篓冲,所以我們需要對(duì)?Connector?進(jìn)行擴(kuò)展李破。

? ? ? ? 其中Connector?支持參數(shù)屬性可以參考Tomcat官方網(wǎng)站(https://tomcat.apache.org/tomcat-8.0-doc/config/http.html)宠哄,非常多,所以本文就只介紹些常用的嗤攻。

? ? ? ? 我們將?Connector?配置修改為如下:

<Connector?port="8080"?????????????

protocol="HTTP/1.1"?????????????

maxThreads="1000"????????????

?minSpareThreads="100"????????????

?acceptCount="1000"??????????

?maxConnections="1000"??????????

??connectionTimeout="20000"????????????

?maxHttpHeaderSize="8192"????????????

tcpNoDelay="true"???????????

?compression="on"????????????

compressionMinSize="2048"???????????

?disableUploadTimeout="true"????????????

redirectPort="8443"???????

?enableLookups="false"????????????

URIEncoding="UTF-8"?/>??

1)port:代表Tomcat監(jiān)聽(tīng)端口毛嫉,也就是網(wǎng)站的訪問(wèn)端口,默認(rèn)為8080妇菱,可以根據(jù)需要改成其他承粤。

2)protocol:協(xié)議類型,可選類型有四種闯团,分別為BIO(阻塞型IO)辛臊,NIO,NIO2和APR房交。

(1)BIO:BIO(Blocking I/O)浪讳,顧名思義,即阻塞式I/O操作涌萤,表示Tomcat使用的是傳統(tǒng)的Java?I/O操作(即java.io包及其子包)淹遵。Tomcat在默認(rèn)情況下,是以bio模式運(yùn)行的负溪。遺憾的是透揣,就一般而言,bio模式是三種運(yùn)行模式中性能最低的一種川抡。BIO配置采用默認(rèn)即可辐真。

(2)NIO:NIO(New I/O),是Java SE1.4及后續(xù)版本提供的一種新的I/O操作方式(即java.nio包及其子包)崖堤。Java nio是一個(gè)基于緩沖區(qū)侍咱、并能提供非阻塞I/O操作的java?API,因此nio也被看成是non-blocking I/O的縮寫(xiě)密幔。它擁有比傳統(tǒng)I/O操作(bio)更好的并發(fā)運(yùn)行性能楔脯。要讓Tomcat以nio模式來(lái)運(yùn)行也比較簡(jiǎn)單,我們只需要protocol類型修改為:

//NIO??protocol="org.apache.coyote.http11.Http11NioProtocol"?

//NIO2??protocol="org.apache.coyote.http11.Http11Nio2Protocol"??

?即可胯甩。

? ? ? ? (3)APR:APR(Apache Portable Runtime/Apache可移植運(yùn)行時(shí))昧廷,是Apache HTTP服務(wù)器的支持庫(kù)。你可以簡(jiǎn)單地理解為:Tomcat將以JNI的形式調(diào)用 Apache HTTP服務(wù)器的核心動(dòng)態(tài)鏈接庫(kù)來(lái)處理文件讀取或網(wǎng)絡(luò)傳輸操作偎箫,從而大大地提高 Tomcat對(duì)靜態(tài)文件的處理性能木柬。?

? ? ? ? 與配置 NIO運(yùn)行模式一樣,也需要將對(duì)應(yīng)的 Connector節(jié)點(diǎn)的 protocol屬性值改為:

protocol="org.apache.coyote.http11.Http11AprProtocol"??

相關(guān)APR介紹及配置會(huì)在下面專門(mén)講淹办。

3)maxThreads:由該連接器創(chuàng)建的處理請(qǐng)求線程的最大數(shù)目眉枕,也就是可以處理的同時(shí)請(qǐng)求的最大數(shù)目。如果未配置默認(rèn)值為200。如果一個(gè)執(zhí)行器與此連接器關(guān)聯(lián)速挑,則忽略此屬性谤牡,因?yàn)樵搶傩詫⒈缓雎裕栽撨B接器將使用執(zhí)行器而不是一個(gè)內(nèi)部線程池來(lái)執(zhí)行任務(wù)梗摇。

? ? ? ? maxThreads是一個(gè)重要的配置屬性,maxThreads配置的合理直接影響了Tomcat的相關(guān)性能想许,所以這里我們重點(diǎn)討論下伶授。

maxThreads并不是配置的越大越好,事實(shí)上你即使配置成999999也是沒(méi)有用的流纹,因?yàn)檫@個(gè)最大值是受操作系統(tǒng)及相關(guān)硬件所制約的糜烹,并且最大值并不一定是最優(yōu)值,所以我們追尋的應(yīng)該是最優(yōu)值而不是最大值漱凝。

QPS(Query Per Second):每秒查詢率QPS是對(duì)一個(gè)特定的查詢服務(wù)器在規(guī)定時(shí)間內(nèi)所處理流量多少的衡量標(biāo)準(zhǔn)疮蹦。我們常常使用 QPS值來(lái)衡量一個(gè)服務(wù)器的性能。

? ? ? ? QPS = 并發(fā)數(shù) / 平均響應(yīng)時(shí)間

? ? ? ? 或者

? ? ? ? 并發(fā)數(shù) = QPS * 平均響應(yīng)時(shí)間

一個(gè)系統(tǒng)吞吐量通常由QPS茸炒、并發(fā)數(shù)兩個(gè)因素決定愕乎,每套系統(tǒng)的這兩個(gè)值都有一個(gè)相對(duì)極限值,在應(yīng)用場(chǎng)景訪問(wèn)壓力下壁公,只要某一項(xiàng)達(dá)到系統(tǒng)最高值感论,系統(tǒng)的吞吐量就上不去了,如果壓力繼續(xù)增大紊册,系統(tǒng)的吞吐量反而會(huì)下降比肄,原因是系統(tǒng)超負(fù)荷工作,上下文切換囊陡、內(nèi)存等等其它消耗導(dǎo)致系統(tǒng)性能下降芳绩。所謂吞吐量這里可以理解為每秒能處理請(qǐng)求的次數(shù)。

? ? ? ? 所以選擇一個(gè)合理的?maxThreads值撞反,其實(shí)并不是那么容易的事妥色。因?yàn)檫^(guò)多的線程只會(huì)造成,更多的內(nèi)存開(kāi)銷(xiāo)遏片,更多的CPU開(kāi)銷(xiāo)垛膝,但是對(duì)提升QPS確毫無(wú)幫助;找到最佳線程數(shù)后通過(guò)簡(jiǎn)單的設(shè)置丁稀,可以讓web系統(tǒng)更加穩(wěn)定吼拥,得到最高,最穩(wěn)定的QPS輸出线衫。

? ? ? ? 我們可以通過(guò)以下幾種方式來(lái)獲取?maxThreads的最佳值:

(1)通過(guò)線上系統(tǒng)不斷使用和用戶的不斷增長(zhǎng)來(lái)進(jìn)行性能測(cè)試凿可,觀察QPS,響應(yīng)時(shí)間,這種方式會(huì)在爆發(fā)式增長(zhǎng)時(shí)系統(tǒng)崩潰枯跑,如雙12等惨驶。

? ? ? ? (2)根據(jù)公式計(jì)算,服務(wù)器端最佳線程數(shù)量=((線程等待時(shí)間+線程cpu時(shí)間)/線程cpu時(shí)間) * cpu數(shù)量敛助,這種方式有時(shí)會(huì)被誤導(dǎo)粗卜,因?yàn)槟承┫到y(tǒng)處理環(huán)節(jié)可能會(huì)耗時(shí)比較長(zhǎng),從而影響公式的結(jié)果纳击。

? ? ? ? (3)單续扔、多用戶壓力測(cè)試,查看CPU的消耗焕数,然后直接乘以百分比纱昧,再進(jìn)行壓測(cè),一般這個(gè)值的附近應(yīng)該就是最佳線程數(shù)量堡赔,這種方式理想場(chǎng)景比較適用识脆,實(shí)際情況會(huì)比這個(gè)復(fù)雜的多。

? ? ? ? (4)根據(jù)系統(tǒng)的自身情況調(diào)整善已,如硬件限制灼捂,系統(tǒng)限制,程序處理能力限制等换团。

? ? ? ? (5)定期修改為不同的?maxThreads值纵东,看服務(wù)器響應(yīng)結(jié)果及用戶反應(yīng)。

QPS和線程數(shù)的關(guān)系

? ? ? ? (1)在最佳線程數(shù)量之前啥寇,QPS和線程是互相遞增的關(guān)系报强,線程數(shù)量到了最佳線程之后半抱,QPS持平啼县,不在上升凝赛,甚至略有下降,同時(shí)相應(yīng)時(shí)間持續(xù)上升磷醋。

? ? ? ? (2)同一個(gè)系統(tǒng)而言猫牡,支持的線程數(shù)越多(最佳線程數(shù)越多而不是配置的線程數(shù)越多),QPS越高邓线。

QPS和響應(yīng)時(shí)間的關(guān)系

? ? ? ? (1)對(duì)于一般的web系統(tǒng)淌友,響應(yīng)時(shí)間一般有CPU執(zhí)行時(shí)間+IO等待時(shí)間組成。

? ? ? ? (2)CPU的執(zhí)行時(shí)間減少骇陈,對(duì)QPS有實(shí)質(zhì)的提升震庭,IO時(shí)間的減少,對(duì)QPS提升不明顯你雌。如果要想明顯提升QPS器联,優(yōu)化系統(tǒng)的時(shí)候要著重優(yōu)化CPU消耗大戶二汛。

? ? ? ? 所以想要找出?maxThreads的最優(yōu)值可并不容易,沒(méi)有最好只有更好拨拓,更好的值只能通過(guò)時(shí)間來(lái)顯現(xiàn)肴颊,如果你不想考慮那么多,一般情況下設(shè)置成1000即可渣磷。

4)minSpareThreads:線程的最小運(yùn)行數(shù)目婿着,這些始終保持運(yùn)行。如果未指定醋界,默認(rèn)值為10竟宋。

5)acceptCount:當(dāng)所有可能的請(qǐng)求處理線程都在使用時(shí)傳入連接請(qǐng)求的最大隊(duì)列長(zhǎng)度。如果未指定物独,默認(rèn)值為100袜硫。一般是設(shè)置的跟 maxThreads一樣或一半氯葬,此值設(shè)置的過(guò)大會(huì)導(dǎo)致排隊(duì)的請(qǐng)求超時(shí)而未被處理挡篓。所以這個(gè)值應(yīng)該是主要根據(jù)應(yīng)用的訪問(wèn)峰值與平均值來(lái)權(quán)衡配置。

6)maxConnections:在任何給定的時(shí)間內(nèi)帚称,服務(wù)器將接受和處理的最大連接數(shù)官研。當(dāng)這個(gè)數(shù)字已經(jīng)達(dá)到時(shí),服務(wù)器將接受但不處理闯睹,等待進(jìn)一步連接戏羽。NIO與NIO2的默認(rèn)值為10000,APR默認(rèn)值為8192楼吃。

7)connectionTimeout:當(dāng)請(qǐng)求已經(jīng)被接受始花,但未被處理,也就是等待中的超時(shí)時(shí)間孩锡。單位為毫秒酷宵,默認(rèn)值為60000。通常情況下設(shè)置為30000躬窜。

? ? ? ? 8)maxHttpHeaderSize:請(qǐng)求和響應(yīng)的HTTP頭的最大大小浇垦,以字節(jié)為單位指定。如果沒(méi)有指定荣挨,這個(gè)屬性被設(shè)置為8192(8 KB)男韧。

9)tcpNoDelay:如果為true,服務(wù)器socket會(huì)設(shè)置TCP_NO_DELAY選項(xiàng)默垄,在大多數(shù)情況下可以提高性能此虑。缺省情況下設(shè)為true。

? ? ? ? 10)compression:是否啟用gzip壓縮口锭,默認(rèn)為關(guān)閉狀態(tài)寡壮。這個(gè)參數(shù)的可接受值為“off”(不使用壓縮),“on”(壓縮文本數(shù)據(jù)),“force”(在所有的情況下強(qiáng)制壓縮)况既。

11)compressionMinSize:如果compression="on"这溅,則啟用此項(xiàng)。被壓縮前數(shù)據(jù)的最小值棒仍,也就是超過(guò)這個(gè)值后才被壓縮悲靴。如果沒(méi)有指定,這個(gè)屬性默認(rèn)為“2048”(2K)莫其,單位為byte癞尚。

12)disableUploadTimeout:這個(gè)標(biāo)志允許servletContainer在一個(gè)servlet執(zhí)行的時(shí)候,使用一個(gè)不同的乱陡,更長(zhǎng)的連接超時(shí)浇揩。最終的結(jié)果是給servlet更長(zhǎng)的時(shí)間以便完成其執(zhí)行,或者在數(shù)據(jù)上載的時(shí)候更長(zhǎng)的超時(shí)時(shí)間憨颠。如果沒(méi)有指定胳徽,設(shè)為false。

13)enableLookups:關(guān)閉DNS反向查詢爽彤。

14)URIEncoding:URL編碼字符集养盗。

? ? ? ? Connector 還有很多其他參數(shù),可以參考Tomcat官網(wǎng)适篙,這里只介紹與性能相關(guān)的部分往核。

2.BIO、NIO嚷节、APR

? ? ? ? 通過(guò)配置 protocol的類型可以使用不同的 Connector處理請(qǐng)求聂儒。

//BIO??

protocol="HTTP/1.1"??

//NIO??

protocol="org.apache.coyote.http11.Http11NioProtocol"??

//NIO2??

protocol="org.apache.coyote.http11.Http11Nio2Protocol"??

//APR?

?protocol="org.apache.coyote.http11.Http11AprProtocol"??

?以下是幾種類型 Connector的參數(shù)對(duì)比:


并不是說(shuō) BIO的性能就一定不如 NIO,這幾種類型 Connector之間并沒(méi)有明顯的性能區(qū)別硫痰,它們之間實(shí)現(xiàn)流程和原理不同衩婚,所以它們的選擇是需要根據(jù)應(yīng)用的類型來(lái)決定的。

? ? ? ? BIO更適合處理簡(jiǎn)單流程碍论,如程序處理較快可以立即返回結(jié)果谅猾。簡(jiǎn)單項(xiàng)目及應(yīng)用可以采用BIO。

? ? ? ? NIO更適合后臺(tái)需要耗時(shí)完成請(qǐng)求的操作鳍悠,如程序接到了請(qǐng)求后需要比較耗時(shí)的處理這已請(qǐng)求税娜,所以無(wú)法立即返回結(jié)果,這樣如果采用BIO就會(huì)占用一個(gè)連接藏研,而使用NIO后就可以將此連接轉(zhuǎn)讓給其他請(qǐng)求敬矩,直至程序處理完成返回為止。

? ? ? ? APR可以大大提升Tomcat對(duì)靜態(tài)文件的處理性能蠢挡,同時(shí)如果你使用了HTTPS方式傳輸?shù)脑捇≡溃部梢蕴嵘齋SL的處理性能凳忙。

? ? ? ? 本文的最后會(huì)對(duì)幾種?Connector進(jìn)行對(duì)比測(cè)試。

3.線程池

? ? ? ? Executor代表了一個(gè)線程池禽炬,可以在Tomcat組件之間共享涧卵。使用線程池的好處在于減少了創(chuàng)建銷(xiāo)毀線程的相關(guān)消耗,而且可以提高線程的使用效率腹尖。

? ? ? ? 要想使用線程池柳恐,首先需要在 Service標(biāo)簽中配置 Executor,如下:

<Service?name="Catalina">??????

<Executor?name="tomcatThreadPool"????????????

namePrefix="catalina-exec-"????????????

maxThreads="1000"????????????

minSpareThreads="100"???????????

maxIdleTime="60000"??????????

?maxQueueSize="Integer.MAX_VALUE"???????????

prestartminSpareThreads="false"???????????

threadPriority="5"???????????

className="org.apache.catalina.core.StandardThreadExecutor"/>??

其中热幔,

? ? ? ? name:線程池名稱乐设,用于?Connector中指定。

? ? ? ? namePrefix:所創(chuàng)建的每個(gè)線程的名稱前綴绎巨,一個(gè)單獨(dú)的線程名稱為 namePrefix+threadNumber近尚。

? ? ? ? maxThreads:池中最大線程數(shù)。

? ? ? ? minSpareThreads:活躍線程數(shù)场勤,也就是核心池線程數(shù)戈锻,這些線程不會(huì)被銷(xiāo)毀,會(huì)一直存在却嗡。

? ? ? ? maxIdleTime:線程空閑時(shí)間舶沛,超過(guò)該時(shí)間后嘹承,空閑線程會(huì)被銷(xiāo)毀窗价,默認(rèn)值為6000(1分鐘),單位毫秒叹卷。

? ? ? ? maxQueueSize:在被執(zhí)行前最大線程排隊(duì)數(shù)目撼港,默認(rèn)為Int的最大值,也就是廣義的無(wú)限骤竹。除非特殊情況帝牡,這個(gè)值不需要更改,否則會(huì)有請(qǐng)求不會(huì)被處理的情況發(fā)生蒙揣。

? ? ? ? prestartminSpareThreads:?jiǎn)?dòng)線程池時(shí)是否啟動(dòng)?minSpareThreads部分線程靶溜。默認(rèn)值為false,即不啟動(dòng)懒震。

? ? ? ? threadPriority:線程池中線程優(yōu)先級(jí)罩息,默認(rèn)值為5,值從1到10个扰。

? ? ? ? className:線程池實(shí)現(xiàn)類瓷炮,未指定情況下,默認(rèn)實(shí)現(xiàn)類為org.apache.catalina.core.StandardThreadExecutor递宅。如果想使用自定義線程池首先需要實(shí)現(xiàn)?org.apache.catalina.Executor接口娘香。

? ? ? ? 線程池配置完成后需要在?Connector中指定:

<Connector?executor="tomcatThreadPool"??

4.Listener

? ? ? ? 另一個(gè)影響Tomcat 性能的因素是內(nèi)存泄露苍狰。Server標(biāo)簽中可以配置多個(gè)Listener,其中 JreMemoryLeakPreventionListener是用來(lái)預(yù)防JRE內(nèi)存泄漏烘绽。此Listener只需在Server標(biāo)簽中配置即可淋昭,默認(rèn)情況下無(wú)需配置,已經(jīng)添加在 Server中安接。

<Listener?className="org.apache.catalina.core.JreMemoryLeakPreventionListener"?/>??

三响牛、組件優(yōu)化

1.APR

? ? ? ? 之前一直都在說(shuō)APR,那么APR到底能給我們帶來(lái)什么赫段?這節(jié)就開(kāi)始學(xué)習(xí)APR相關(guān)知識(shí)呀打。

? ? ? ? APR(Apache Portable Runtime)是一個(gè)高可移植庫(kù),它是Apache HTTP Server 2.x的核心糯笙。APR有很多用途贬丛,包括訪問(wèn)高級(jí) IO功能(例如sendfile,epoll和OpenSSL),OS級(jí)別功能(隨機(jī)數(shù)生成给涕,系統(tǒng)狀態(tài)等等)豺憔,本地進(jìn)程管理(共享內(nèi)存,NT管道和UNIX sockets)够庙。這些功能可以使Tomcat作為一個(gè)通常的前臺(tái)WEB服務(wù)器恭应,能更好地和其它本地web技術(shù)集成,總體上讓Java更有效率作為一個(gè)高性能web服務(wù)器平臺(tái)而不是簡(jiǎn)單作為后臺(tái)容器耘眨。

? ? ? ? APR的目的如其名稱一樣昼榛,主要為上層的應(yīng)用程序提供一個(gè)可以跨越多操作系統(tǒng)平臺(tái)使用的底層支持接口庫(kù)。在早期的Apache版本中剔难,應(yīng)用程序本身必須能夠處理各種具體操作系統(tǒng)平臺(tái)的細(xì)節(jié)胆屿,并針對(duì)不同的平臺(tái)調(diào)用不同的處理函數(shù)。隨著Apache的進(jìn)一步開(kāi)發(fā)偶宫,Apache組織決定將這些通用的函數(shù)獨(dú)立出來(lái)并發(fā)展成為一個(gè)新的項(xiàng)目非迹。這樣,APR的開(kāi)發(fā)就從Apache中獨(dú)立出來(lái)纯趋,Apache僅僅是使用APR而已憎兽。目前APR主要還是由Apache使用,不過(guò)由于APR的較好的移植性吵冒,因此一些需要進(jìn)行移植的C程序也開(kāi)始使用APR纯命。

APR使得平臺(tái)細(xì)節(jié)的處理進(jìn)行下移。對(duì)于應(yīng)用程序而言桦锄,它們根本就不需要考慮具體的平臺(tái)扎附,不管是Unix、linux還是Window结耀,應(yīng)用程序執(zhí)行的接口基本都是統(tǒng)一一致的留夜。因此對(duì)于APR而言匙铡,可移植性和統(tǒng)一的上層接口是其考慮的一個(gè)重點(diǎn)。而APR最早的目的并不是如此碍粥,它最早只是希望將Apache中用到的所有代碼合并為一個(gè)通用的代碼庫(kù)鳖眼,然而這不是一個(gè)正確的策略,因此后來(lái)APR改變了其目標(biāo)嚼摩。有的時(shí)候使用公共代碼并不是一件好事钦讳,比如如何將一個(gè)請(qǐng)求映射到線程或者進(jìn)程是平臺(tái)相關(guān)的,因此僅僅一個(gè)公共的代碼庫(kù)并不能完成這種區(qū)分枕面。APR的目標(biāo)則是希望安全合并所有的能夠合并的代碼而不需要犧牲性能愿卒。

? ? ? ?(1)下載

? ? ? ? APR沒(méi)有二進(jìn)制包可以下載,所以只能下載源代碼版潮秘,下載后需要構(gòu)建琼开,需要下載的文件有:apr-1.5.2.tar.gz、apr-iconv-1.2.1.tar.gz枕荞、apr-util-1.5.4.tar.gz(Linux版為例)這三個(gè)柜候。

? ? ? ? APR的官網(wǎng)為:http://apr.apache.org/

? ? ? ?(2)安裝

? ? ? ? windows下構(gòu)建源代碼比較麻煩,需要Visual Studio支持躏精。

? ? ? ? Linux下構(gòu)建就相對(duì)簡(jiǎn)單和熟悉了渣刷,只需要執(zhí)行常規(guī)構(gòu)建命令即可:

./configure?--prefix=/usr/local/apr??

make??

make?install??

?安裝成功后,APR會(huì)默認(rèn)安裝在 /usr/local/apr目錄下矗烛,也可以指定安裝目錄辅柴。

? ? ? ? apr-iconv安裝時(shí)需要指定apr的安裝位置:

./configure?--prefix=/usr/local/apr-iconv?--with-apr=/usr/local/apr???

make???

make?install??

? apr-util安裝時(shí)需要指定apr的安裝位置:

./configure?--prefix=/usr/local/apr-util?--with-apr=/usr/local/apr?--with-apr-iconv=/usr/local/apr-iconv/bin/apriconv???

make??

?make?install???

安裝完成后目錄結(jié)構(gòu):


? ? ? ? 安裝完成后其實(shí)是無(wú)法直接使用APR的,想使用APR還需要安裝Tomcat Native高诺,否則Tomcat啟動(dòng)時(shí)會(huì)報(bào)以下錯(cuò)誤:

16-May-2016?02:52:42.992?INFO?[main]?org.apache.catalina.core.AprLifecycleListener.lifecycleEvent?The?APR?based?Apache?Tomcat?Native?library?which?allows?optimal?performance?in?production?environments?was?not?found?on?the?java.library.path:?/usr/local/apr/lib:/usr/java/packages/lib/amd64:/usr/lib64:/lib64:/lib:/usr/lib??

2.Tomcat Native

? ? ? ? Tomcat Native是 Tomcat可選組件碌识,它可以讓 Tomcat使用 Apache 的 APR包來(lái)處理包括文件和網(wǎng)絡(luò)IO操作碾篡,從而提升性能及兼容性虱而。

1)下載

? ? ? ? Tomcat Native可以選擇Windows與Linux版本下載。

Tomcat Native下載地址為:http://tomcat.apache.org/download-native.cgi

2)安裝

? ? ? (1)Linux/Unix下

? ? ? ? 安裝Tomcat Native前需要安裝以下組件:

? ? ? ? ??APR library(我們已安裝)

? ? ? ? ??OpenSSL libraries

?Java SEDevelopment Kit (JDK)(也已安裝)

? ? ? ? OpenSSL libraries安裝通過(guò)以下命令:

yum?install?apr-devel?openssl-devel??

安裝成功后就可以安裝Tomcat Native了开泽,運(yùn)行以下命令下載地址

./configure?--with-apr=/usr/local/apr/bin/apr-1-config?\??????????????

--with-java-home=/usr/java/jdk1.7.0_79?\??????????????

--with-ssl=yes?\?????????????

?--prefix=/usr/local/tomcat??

?注意牡拇,--prefix指向的是 Tomcat目錄。

? ? ? ? 注意穆律,下載后的?Tomcat Native解壓后目錄結(jié)構(gòu)如下:


?安裝時(shí)需要進(jìn)入native目錄惠呼。

安裝過(guò)程中還有可能產(chǎn)生依賴包版本不兼容的問(wèn)題(一般為openssl版本過(guò)低),這時(shí)需要卸載舊的依賴峦耘,并安裝最新版本

? ? ? ? 當(dāng)安裝完成后出現(xiàn)以下類似輸出時(shí)剔蹋,說(shuō)明安裝已經(jīng)成功:

Libraries?have?been?installed?in:?????/usr/local/tomcat/lib????

If?you?ever?happen?to?want?to?link?against?installed?libraries??in?a?given?directory,?LIBDIR,?you?must?either?use?libtool,?and??specify?the?full?pathname?of?the?library,?or?use?the?`-LLIBDIR'??flag?during?linking?and?do?at?least?one?of?the?following:?????-?add?LIBDIR?to?the?`LD_LIBRARY_PATH'?environment?variable???????during?execution?????-?add?LIBDIR?to?the?`LD_RUN_PATH'?environment?variable???????during?linking?????-?use?the?`-Wl,-rpath?-Wl,LIBDIR'?linker?flag?????-?have?your?system?administrator?add?LIBDIR?to?`/etc/ld.so.conf'????See?any?operating?system?documentation?about?shared?libraries?for??more?information,?such?as?the?ld(1)?and?ld.so(8)?manual?pages.??

----------------------------------------------------------------------?

(2)Windows下

Windows下安裝就異常簡(jiǎn)單了,只需要把bin目錄下文件復(fù)制到tomcat/bin下即可辅髓,如果為64位泣崩,則復(fù)制x64中文件下載地址少梁。


3)使用

? ? ? ?(1)環(huán)境變量配置

? ? ? ? 使用前需要配置環(huán)境變量:

vi?/etc/profile??

?打開(kāi)配置文件后,添加以下內(nèi)容:

export?LD_LIBRARY_PATH=/usr/local/apr/lib??

退出保存矫付,然后執(zhí)行:

source?/etc/profile??

(2)修改Tomcat配置文件

? ? ? ? 打開(kāi)conf/server.xml文件凯沪,修改Connector 標(biāo)志的protocol屬性:

protocol="org.apache.coyote.http11.Http11AprProtocol"??

然后添加Listener:

<Listener?className="org.apache.catalina.core.AprLifecycleListener"?SSLEngine="on"?/>??

?保存配置文件后,啟動(dòng)Tomcat买优,從日志中看到以下輸出時(shí)妨马,說(shuō)明全部功能都已配置成功:

16-May-2016?04:28:54.734?INFO?[main]?org.apache.catalina.core.AprLifecycleListener.lifecycleEvent?Loaded?APR?based?Apache?Tomcat?Native?library?1.1.34?using?APR?version?1.5.2.??16-May-2016?04:28:54.734?INFO?[main]?org.apache.catalina.core.AprLifecycleListener.lifecycleEvent?APR?capabilities:?IPv6?[true],?sendfile?[true],?accept?filters?[false],?random?[true].??16-May-2016?04:28:54.739?INFO?[main]?org.apache.catalina.core.AprLifecycleListener.initializeSSL?OpenSSL?successfully?initialized?(OpenSSL?1.0.2h??3?May?2016)??

?至此,APR與 Native都已安裝完成杀赢,可以使用烘跺,對(duì)于 APR與 Native還有很多知識(shí)要學(xué)習(xí),但不是本文的重點(diǎn)脂崔,所以以后有機(jī)會(huì)還會(huì)深入學(xué)習(xí)液荸。


四、性能測(cè)試

? ? ? ? Tomcat優(yōu)化部分我們已經(jīng)完成脱篙,接下來(lái)就需要比較一下優(yōu)化前與優(yōu)化后的性能對(duì)比娇钱。

1.Jmeter

Apache JMeter是Apache組織開(kāi)發(fā)的基于Java的壓力測(cè)試工具。用于對(duì)軟件做壓力測(cè)試绊困,它最初被設(shè)計(jì)用于Web應(yīng)用測(cè)試文搂,但后來(lái)擴(kuò)展到其他測(cè)試領(lǐng)域。 它可以用于測(cè)試靜態(tài)和動(dòng)態(tài)資源秤朗,例如靜態(tài)文件煤蹭、Java 小服務(wù)程序、CGI 腳本取视、Java 對(duì)象硝皂、數(shù)據(jù)庫(kù)、FTP 服務(wù)器作谭, 等等稽物。JMeter 可以用于對(duì)服務(wù)器、網(wǎng)絡(luò)或?qū)ο竽M巨大的負(fù)載折欠,來(lái)自不同壓力類別下測(cè)試它們的強(qiáng)度和分析整體性能贝或。另外,JMeter能夠?qū)?yīng)用程序做功能/回歸測(cè)試锐秦,通過(guò)創(chuàng)建帶有斷言的腳本來(lái)驗(yàn)證你的程序返回了你期望的結(jié)果咪奖。為了最大限度的靈活性,JMeter允許使用正則表達(dá)式創(chuàng)建斷言酱床。

Apache jmeter 可以用于對(duì)靜態(tài)的和動(dòng)態(tài)的資源(文件羊赵,Servlet,Perl腳本扇谣,java 對(duì)象昧捷,數(shù)據(jù)庫(kù)和查詢揖闸,F(xiàn)TP服務(wù)器等等)的性能進(jìn)行測(cè)試。它可以用于對(duì)服務(wù)器料身、網(wǎng)絡(luò)或?qū)ο竽M繁重的負(fù)載來(lái)測(cè)試它們的強(qiáng)度或分析不同壓力類型下的整體性能汤纸。你可以使用它做性能的圖形分析或在大并發(fā)負(fù)載測(cè)試你的服務(wù)器/腳本/對(duì)象。

? ? ? ? Jmeter官網(wǎng):http://jmeter.apache.org/

1)JMeter的作用

? ? ? ?(1)能夠?qū)TTP和FTP服務(wù)器進(jìn)行壓力和性能測(cè)試芹血, 也可以對(duì)任何數(shù)據(jù)庫(kù)進(jìn)行同樣的測(cè)試(通過(guò)JDBC)贮泞,Jmeter支持以下服務(wù)器協(xié)議類型測(cè)試:

? ? ? ? ??Web - HTTP, HTTPS

? ? ? ? ??SOAP / REST

? ? ? ????FTP

? ? ? ????Database via JDBC

? ? ? ????LDAP

? ? ? ????Message-oriented middleware (MOM) via JMS

? ? ? ????Mail - SMTP(S), POP3(S) and IMAP(S)

?MongoDB(NoSQL)

? ? ? ????Native commands or shell scripts

? ? ? ????TCP

? ? ? (2)完全的可移植性和100% 純java。

? ? ? (3)完全 Swing 和輕量組件支持(預(yù)編譯的JAR使用 javax.swing.*)包幔烛。

? ? ? (4)完全多線程 框架允許通過(guò)多個(gè)線程并發(fā)取樣和 通過(guò)單獨(dú)的線程組對(duì)不同的功能同時(shí)取樣啃擦。

? ? ? (5)精心的GUI設(shè)計(jì)允許快速操作和更精確的計(jì)時(shí)。

? ? ? (6)緩存和離線分析/回放測(cè)試結(jié)果饿悬。

2)JMeter下載地址特性

? ? ? (1)可鏈接的取樣器允許無(wú)限制的測(cè)試能力令蛉。

? ? ? (2)各種負(fù)載統(tǒng)計(jì)表和可鏈接的計(jì)時(shí)器可供選擇。

? ? ? (3)數(shù)據(jù)分析和可視化插件提供了很好的可擴(kuò)展性以及個(gè)性化狡恬。

(4)具有提供動(dòng)態(tài)輸入到測(cè)試的功能(包括JavaScript)珠叔。

? ? ? (5)支持腳本編程的取樣器(在1.9.2及以上版本支持BeanShell)。

? ? ? ? 在設(shè)計(jì)階段弟劲,JMeter能夠充當(dāng)HTTP PROXY(代理)來(lái)記錄IE/NETSCAPE的HTTP請(qǐng)求祷安,也可以記錄apache等WebServer的log文件來(lái)重現(xiàn)HTTP流量。當(dāng)這些HTTP客戶端請(qǐng)求被記錄以后兔乞,測(cè)試運(yùn)行時(shí)可以方便的設(shè)置重復(fù)次數(shù)和并發(fā)度(線程數(shù))來(lái)產(chǎn)生巨大的流量汇鞭。JMeter還提供可視化組件以及報(bào)表工具把量服務(wù)器在不同壓力下的性能展現(xiàn)出來(lái)。

? ? ? ? 相比其他HTTP測(cè)試工具,JMeter最主要的特點(diǎn)在于擴(kuò)展性強(qiáng)庸追。JMeter能夠自動(dòng)掃描其lib/ext子目錄下.jar文件中的插件霍骄,并且將其裝載到內(nèi)存,讓用戶通過(guò)不同的菜單調(diào)用淡溯。

? ? ? ? 3)Jmeter使用

? ? ? ? 使用Jmeter非常簡(jiǎn)單读整,windows下進(jìn)入bin目錄直接雙擊jmeter.bat文件即可,Linux下類似血筑,需要運(yùn)行jmeter.sh文件绘沉,Jmeter運(yùn)行后顯示以下界面:


Jmeter使用起來(lái)比較簡(jiǎn)單,附件是一個(gè)簡(jiǎn)單的配置豺总,直接導(dǎo)入即可使用。

2.測(cè)試條件

? ? ? ? Tomcat版本:8.0.33

? ? ? ? 測(cè)試項(xiàng)目:新創(chuàng)建一個(gè)web項(xiàng)目也不用實(shí)現(xiàn)任何代碼择懂,只需要部署即可以使用喻喳,只有一個(gè)index.jsp文件。

? ? ? ??JDK版本:jdk1.7.0.67

? ? ? ??請(qǐng)求方式:POST

? ? ? ??循環(huán)次數(shù):100困曙,1000

? ? ? ??線程數(shù):10,100,1000

? ? ? ??總次數(shù):總次數(shù) = 線程數(shù) * 循環(huán)次數(shù)

? ? ? ? CPU:英特爾 第二代酷睿 i5-2450M(雙核)

? ? ? ? 內(nèi)存:8GB

? ? ? ? 附件時(shí)Jmeter的配置文件表伦,可以直接導(dǎo)入使用谦去。

3.測(cè)試結(jié)果

? ? ? ? 從部分結(jié)果來(lái)看優(yōu)化過(guò)的Tomcat會(huì)比默認(rèn)性能及并發(fā)處理能力上有提高,但至于參數(shù)的配置需要結(jié)合硬件及操作系統(tǒng)來(lái)不斷調(diào)整蹦哼,所以并不會(huì)有一個(gè)萬(wàn)能的參數(shù)來(lái)使用鳄哭,需要各位不斷的測(cè)試不斷更改。

? ? ? ? 以下是一個(gè)簡(jiǎn)單的測(cè)試結(jié)果纲熏,循環(huán)100次妆丘,線程數(shù)分別為10,100,1000:


各位估計(jì)已經(jīng)發(fā)現(xiàn)了相同的應(yīng)用下并不一定某種protocol就一定性能出色,因?yàn)門(mén)omcat中的這個(gè)測(cè)試項(xiàng)目只有一個(gè)index.jsp頁(yè)面局劲,在較少線程數(shù)訪問(wèn)情況下BIO反應(yīng)最快勺拣,而當(dāng)線程數(shù)達(dá)到1000時(shí)NIO2性能最出色,而APR中規(guī)中矩鱼填,雖然這種測(cè)試的局限性很大药有,但也可以反映出:想要找出適合的配置及最佳性能需要結(jié)合實(shí)際,不斷的測(cè)試與改進(jìn)苹丸,最終才能達(dá)到一個(gè)相對(duì)穩(wěn)定的性能愤惰,雖然此時(shí)的性能未必是最佳的,但卻是能應(yīng)對(duì)絕大多數(shù)情況的赘理。

? ? ? ? 總結(jié):Tomcat相關(guān)優(yōu)化也只是一個(gè)入門(mén)介紹羊苟,每一種技術(shù)之中還是有很多很深?yuàn)W的知識(shí)要去學(xué)習(xí),只有不斷的去學(xué)習(xí)才能不斷的提高感憾。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末蜡励,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子阻桅,更是在濱河造成了極大的恐慌凉倚,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,252評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件嫂沉,死亡現(xiàn)場(chǎng)離奇詭異稽寒,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)趟章,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,886評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)杏糙,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人蚓土,你說(shuō)我怎么就攤上這事宏侍。” “怎么了蜀漆?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,814評(píng)論 0 361
  • 文/不壞的土叔 我叫張陵谅河,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我,道長(zhǎng)绷耍,這世上最難降的妖魔是什么吐限? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,869評(píng)論 1 299
  • 正文 為了忘掉前任,我火速辦了婚禮褂始,結(jié)果婚禮上诸典,老公的妹妹穿的比我還像新娘。我一直安慰自己崎苗,他們只是感情好狐粱,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,888評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著益缠,像睡著了一般脑奠。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上幅慌,一...
    開(kāi)封第一講書(shū)人閱讀 52,475評(píng)論 1 312
  • 那天宋欺,我揣著相機(jī)與錄音,去河邊找鬼胰伍。 笑死齿诞,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的骂租。 我是一名探鬼主播祷杈,決...
    沈念sama閱讀 41,010評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼渗饮!你這毒婦竟也來(lái)了但汞?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,924評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤互站,失蹤者是張志新(化名)和其女友劉穎私蕾,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體胡桃,經(jīng)...
    沈念sama閱讀 46,469評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡踩叭,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,552評(píng)論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了翠胰。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片够吩。...
    茶點(diǎn)故事閱讀 40,680評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡畔况,死狀恐怖十性,靈堂內(nèi)的尸體忽然破棺而出熊尉,到底是詐尸還是另有隱情,我是刑警寧澤闺兢,帶...
    沈念sama閱讀 36,362評(píng)論 5 351
  • 正文 年R本政府宣布茂缚,位于F島的核電站戏罢,受9級(jí)特大地震影響屋谭,放射性物質(zhì)發(fā)生泄漏脚囊。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,037評(píng)論 3 335
  • 文/蒙蒙 一桐磁、第九天 我趴在偏房一處隱蔽的房頂上張望悔耘。 院中可真熱鬧,春花似錦我擂、人聲如沸衬以。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,519評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)看峻。三九已至,卻和暖如春衙吩,著一層夾襖步出監(jiān)牢的瞬間互妓,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,621評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工坤塞, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留冯勉,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,099評(píng)論 3 378
  • 正文 我出身青樓摹芙,卻偏偏與公主長(zhǎng)得像灼狰,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子浮禾,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,691評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容

  • 1 目錄結(jié)構(gòu) /bin:腳本文件目錄交胚。 /common/lib:存放所有web項(xiàng)目都可以訪問(wèn)的公共jar包(使用C...
    SkTj閱讀 3,645評(píng)論 0 3
  • Tomcat可以從內(nèi)存、并發(fā)盈电、緩存等方面進(jìn)行優(yōu)化 1蝴簇、Tomcat內(nèi)存優(yōu)化: 在tomcat的啟動(dòng)腳本catali...
    心云間丶聆聽(tīng)閱讀 1,655評(píng)論 0 7
  • 常見(jiàn)的http服務(wù)器有apache,nginx挣轨,iis军熏,tomcat等。HTTP服務(wù)器本質(zhì)上也是一種應(yīng)用程序——它...
    可樂(lè)愛(ài)上咖啡閱讀 3,985評(píng)論 1 49
  • 前言 在使用tomcat時(shí)卷扮,經(jīng)常會(huì)遇到連接數(shù)荡澎、線程數(shù)之類的配置問(wèn)題,要真正理解這些概念晤锹,必須先了解Tomcat的連...
    程序員BUG閱讀 369評(píng)論 0 0
  • 忙到晚飯時(shí)鞭铆,因良人未歸或衡,一切從簡(jiǎn)焦影。想起前日買(mǎi)回的花卷在冰箱遂蒸來(lái)食之,就著現(xiàn)炒小菜封断,食來(lái)甚香斯辰! 想來(lái)萬(wàn)物皆有存世的...
    強(qiáng)詞不奪理閱讀 521評(píng)論 0 0