一:Tomcat內(nèi)存優(yōu)化,
啟動時告訴JVM我要一塊大內(nèi)存(調(diào)優(yōu)內(nèi)存是最直接的方式)
Windows 下的catalina.bat
Linux 下的
catalina.sh 如:
JAVA_OPTS='-Xms256m -Xmx512m'
-Xms JVM初始化堆的大小
-Xmx JVM堆的最大值 實際參數(shù)大小根據(jù)服務(wù)器配置或者項目具體設(shè)置.
二:Tomcat 線程優(yōu)化
在server.xml中 如:
connectionTimeout="20000" ?/>
maxThreads="X" 表示最多同時處理X個連接
minSpareThreads="X" 初始化X個連接
maxSpareThreads="X" 表示如果最多可以有X個線程此蜈,一旦超過X個,則會關(guān)閉不在需要的線程
acceptCount="X" 當(dāng)同時連接的人數(shù)達到maxThreads時,還可以排隊,隊列大小為X.超過X就不處理
三:Tomcat IO優(yōu)化
1:同步阻塞IO(JAVA BIO) 同步并阻塞,服務(wù)器實現(xiàn)模式為一個連接一個線程(one connection one thread 想想都覺得恐怖,線程可是非常寶貴的資源),當(dāng)然可以通過線程池機制改善.
2:JAVA NIO:又分為同步非阻塞IO,異步阻塞IO 與BIO最大的區(qū)別one request one thread.可以復(fù)用同一個線程處理多個connection(多路復(fù)用).
3:,異步非阻塞IO(Java NIO2又叫AIO) 主要與NIO的區(qū)別主要是操作系統(tǒng)的底層區(qū)別.可以做個比喻:比作快遞筷狼,NIO就是網(wǎng)購后要自己到官網(wǎng)查下快遞是否已經(jīng)到了(可能是多次)隧魄,然后自己去取快遞凫岖;AIO就是快遞員送貨上門了(不用關(guān)注快遞進度)。
BIO方式適用于連接數(shù)目比較小且固定的架構(gòu)峭火,這種方式對服務(wù)器資源要求比較高,并發(fā)局限于應(yīng)用中智嚷,JDK1.4以前的唯一選擇躲胳,但程序直觀簡單易理解.
NIO方式適用于連接數(shù)目多且連接比較短(輕操作)的架構(gòu),比如聊天服務(wù)器纤勒,并發(fā)局限于應(yīng)用中坯苹,編程比較復(fù)雜,JDK1.4開始支持.
AIO方式使用于連接數(shù)目多且連接比較長(重操作)的架構(gòu)摇天,比如相冊服務(wù)器粹湃,充分調(diào)用OS參與并發(fā)操作恐仑,編程比較復(fù)雜,JDK7開始支持.
在server.xml中
connectionTimeout="20000"
URIEncoding="UTF-8"
useBodyEncodingForURI="true"
enableLookups="false"
redirectPort="8443" />
實現(xiàn)對Tomcat的IO切換.
四:大殺器APR
APR是從操作系統(tǒng)級別來解決異步的IO問題,大幅度的提高性能. (
http://apr.apache.org/).
APR(Apache Portable Runtime)是一個高可移植庫,它是Apache HTTP Server 2.x的核心.能更好地和其它本地web技術(shù)集成为鳄,總體上讓Java更有效率作為一個高性能web服務(wù)器平臺而不是簡單作為后臺容器.
在產(chǎn)品環(huán)境中裳仆,特別是直接使用Tomcat做WEB服務(wù)器的時候,應(yīng)該使用Tomcat Native來提高其性能.如果不配APR孤钦,基本上300個線程狠快就會用滿歧斟,以后的請求就只好等待.但是配上APR之后,并發(fā)的線程數(shù)量明顯下降偏形,從原來的300可能會馬上下降到只有幾十静袖,新的請求會毫無阻塞的進來.
在局域網(wǎng)環(huán)境測,就算是400個并發(fā)俊扭,也是一瞬間就處理/傳輸完畢队橙,但是在真實的Internet環(huán)境下,頁面處理時間只占0.1%都不到萨惑,絕大部分時間都用來頁面?zhèn)鬏?如果不用APR捐康,一個線程同一時間只能處理一個用戶,勢必會造成阻塞庸蔼。所以生產(chǎn)環(huán)境下用apr是非常必要的.