Tomcat性能調(diào)優(yōu):
找到Tomcat根目錄下的conf目錄倘待,修改server.xml文件的內(nèi)容软啼。對于這部分的調(diào)優(yōu),我所了解到的就是無非設(shè)置一下Tomcat服務(wù)器的最大并發(fā)數(shù)和Tomcat初始化時創(chuàng)建的線程數(shù)的設(shè)置延柠,當(dāng)然還有其他一些性能調(diào)優(yōu)的設(shè)置祸挪,下圖是我根據(jù)我機子的性能設(shè)置的一些參數(shù)值,給各位詳細解釋一下吧:
1贞间、URIEncoding=”UTF-8″ :設(shè)置Tomcat的字符集贿条。這種配置我們一般是不會設(shè)置的,因為關(guān)于亂碼的轉(zhuǎn)換我們會在具體項目中具體處理增热,直接修改Tomcat的字符集未免過于太死板整以。
2、maxThreads=”300″ :設(shè)置當(dāng)前Tomcat的最大并發(fā)數(shù)峻仇。Tomcat默認(rèn)配置的最大請求數(shù)是150個公黑,即同時能支持150個并發(fā)。但是在實際運用中摄咆,最大并發(fā)數(shù)與硬件性能和CPU數(shù)量都有很大關(guān)系的凡蚜,更好的硬件、更高的處理器都會使Tomcat支持更多的并發(fā)數(shù)吭从。如果一般在實際開發(fā)中朝蜘,當(dāng)某個應(yīng)用擁有 250 個以上并發(fā)的時候,都會考慮到應(yīng)用服務(wù)器的集群涩金。
3谱醇、minSpareThreads=”50″ :設(shè)置當(dāng)前Tomcat初始化時創(chuàng)建的線程數(shù)暇仲,默認(rèn)值為25。
4副渴、acceptCount=”250″ :當(dāng)同時連接的人數(shù)達到maxThreads參數(shù)設(shè)置的值時奈附,還可以接收排隊的連接數(shù)量,超過這個連接的則直接返回拒絕連接煮剧。指定當(dāng)任何能夠使用的處理請求的線程數(shù)都被使用時斥滤,能夠放到處理隊列中的請求數(shù),超過這個數(shù)的請求將不予處理轿秧。默認(rèn)值為100中跌。在實際應(yīng)用中咨堤,如果想加大Tomcat的并發(fā)數(shù) 菇篡,應(yīng)該同時加大acceptCount和maxThreads的值。
5一喘、enableLookups=”false” :是否開啟域名反查驱还,一般設(shè)置為false來提高處理能力,它的取值還有true凸克,一般很少使用议蟆。
6、maxKeepAliveRequests=”1″ :nginx動態(tài)的轉(zhuǎn)給tomcat萎战,nginx是不能keepalive的咐容,而tomcat端默認(rèn)開啟了keepalive,會等待keepalive的timeout蚂维,默認(rèn)不設(shè)置就是使用connectionTimeout戳粒。所以必須設(shè)置tomcat的超時時間,并關(guān)閉tomcat的keepalive虫啥。否則會產(chǎn)生大量tomcat的socket timewait蔚约。maxKeepAliveRequests=”1”就可以避免tomcat產(chǎn)生大量的TIME_WAIT連接,從而從一定程度上避免tomcat假死涂籽。
JVM性能調(diào)優(yōu):
Tomcat本身還是運行在JVM上的苹祟,通過對JVM參數(shù)的調(diào)整我們可以使Tomcat擁有更好的性能。目前針對JVM的調(diào)優(yōu)主要有兩個方面:內(nèi)存調(diào)優(yōu)和垃圾回收策略調(diào)優(yōu)评雌。
一树枫、內(nèi)存調(diào)優(yōu)
找到Tomcat根目錄下的bin目錄,設(shè)置catalina.sh文件中JAVA_OPTS變量即可景东,因為后面的啟動參數(shù)會把JAVA_OPTS作為JVM的啟動參數(shù)來處理团赏。再說Java虛擬機的內(nèi)存結(jié)構(gòu)是有點復(fù)雜的,相信很多人在理解上都是很抽象的耐薯,它主要分為堆舔清、棧丝里、方法區(qū)和垃圾回收系統(tǒng)等幾個部分組成,下面是我從網(wǎng)上扒的內(nèi)存結(jié)構(gòu)圖:
內(nèi)存調(diào)優(yōu)這塊呢体谒,無非就是通過修改它們各自的內(nèi)存空間的大小杯聚,使應(yīng)用能夠更加合理的運用,下圖是我根據(jù)我機子的性能設(shè)置的參數(shù)抒痒,給各位詳細解釋一下各個參數(shù)的含義吧:
1幌绍、-Xmx512m :設(shè)置Java虛擬機的堆的最大可用內(nèi)存大小,單位:兆(m)故响,整個堆大小=年輕代大小 + 年老代大小 + 持久代大小傀广。持久代一般固定大小為64m。堆的不同分布情況彩届,對系統(tǒng)會產(chǎn)生一定的影響伪冰。盡可能將對象預(yù)留在新生代,減少老年代GC的次數(shù)(通常老年回收起來比較慢)樟蠕。實際工作中贮聂,通常將堆的初始值和最大值設(shè)置相等,這樣可以減少程序運行時進行的垃圾回收次數(shù)和空間擴展寨辩,從而提高程序性能吓懈。
2、-Xms512m :設(shè)置Java虛擬機的堆的初始值內(nèi)存大小靡狞,單位:兆(m)耻警,此值可以設(shè)置與-Xmx相同,以避免每次垃圾回收完成后JVM重新分配內(nèi)存甸怕。
3甘穿、-Xmn170m :設(shè)置年輕代內(nèi)存大小,單位:兆(m)蕾各,此值對系統(tǒng)性能影響較大扒磁,Sun官方推薦配置為整個堆的3/8。一般在增大年輕代內(nèi)存后式曲,也會將會減小年老代大小妨托。
4、-Xss128k :設(shè)置每個線程的棧大小吝羞。JDK5.0以后每個線程棧大小為1M兰伤,以前每個線程棧大小為256K。更具應(yīng)用的線程所需內(nèi)存大小進行調(diào)整钧排。在相同物理內(nèi)存下敦腔,減小這個值能生成更多的線程。但是操作系統(tǒng)對一個進程內(nèi)的線程數(shù)還是有限制的恨溜,不能無限生成符衔,經(jīng)驗值在3000~5000左右找前。
5、 -XX:NewRatio=4 :設(shè)置年輕代(包括Eden和兩個Survivor區(qū))與年老代的比值(除去持久代)判族。設(shè)置為4躺盛,則年輕代與年老代所占比值為1:4,年輕代占整個堆棧的1/5 形帮。
6槽惫、-XX:SurvivorRatio=4 :設(shè)置年輕代中Eden區(qū)與Survivor區(qū)的大小比值。設(shè)置為4辩撑,則兩個Survivor區(qū)與一個Eden區(qū)的比值為2:4界斜,一個Survivor區(qū)占整個年輕代的1/6。
7合冀、-XX:MaxPermSize=16m :設(shè)置持久代大小為16m各薇,上面也說了,持久代一般固定的內(nèi)存大小為64m水慨。
8得糜、-XX:MaxTenuringThreshold=0:設(shè)置垃圾最大年齡敬扛。如果設(shè)置為0的話晰洒,則年輕代對象不經(jīng)過Survivor區(qū),直接進入年老代啥箭。對于年老代比較多的應(yīng)用谍珊,可以提高效率。如果將此值設(shè)置為一個較大值急侥,則年輕代對象會在Survivor區(qū)進行多次復(fù)制砌滞,這樣可以增加對象再年輕代的存活時間,增加在年輕代即被回收的概論坏怪。
二贝润、垃圾回收策略調(diào)優(yōu)
找到Tomcat根目錄下的bin目錄,也是設(shè)置catalina.sh文件中JAVA_OPTS變量即可铝宵。我們都知道Java虛擬機都有默認(rèn)的垃圾回收機制打掘,但是不同的垃圾回收機制的效率是不同的,正是因為這點我們才經(jīng)常對Java虛擬機的垃圾回收策略進行相應(yīng)的調(diào)整鹏秋。下面也是通過我的一些需求來配置的垃圾回收策略:
Java虛擬機的垃圾回收策略一般分為:串行收集器尊蚁、并行收集器和并發(fā)收集器。
串行收集器:
1侣夷、-XX:+UseSerialGC:代表垃圾回收策略為串行收集器横朋,即在整個掃描和復(fù)制過程采用單線程的方式來進行,適用于單CPU百拓、新生代空間較小及對暫停時間要求不是非常高的應(yīng)用上琴锭,是client級別默認(rèn)的GC方式晰甚,主要在JDK1.5之前的垃圾回收方式。
并發(fā)收集器:
1决帖、-XX:+UseParallelGC:代表垃圾回收策略為并行收集器(吞吐量優(yōu)先)压汪,即在整個掃描和復(fù)制過程采用多線程的方式來進行,適用于多CPU古瓤、對暫停時間要求較短的應(yīng)用上止剖,是server級別默認(rèn)采用的GC方式。此配置僅對年輕代有效落君。該配置只能讓年輕代使用并發(fā)收集穿香,而年老代仍舊使用串行收集。
2绎速、-XX:ParallelGCThreads=4:配置并行收集器的線程數(shù)皮获,即:同時多少個線程一起進行垃圾回收。此值最好配置與處理器數(shù)目相等纹冤。
3洒宝、-XX:+UseParallelOldGC:配置年老代垃圾收集方式為并行收集。JDK6.0支持對年老代并行收集 萌京。
4雁歌、-XX:MaxGCPauseMillis=100 :設(shè)置每次年輕代垃圾回收的最長時間,如果無法滿足此時間知残,JVM會自動調(diào)整年輕代大小靠瞎,以滿足此值。
5求妹、-XX:+UseAdaptiveSizePolicy:設(shè)置此選項后乏盐,并行收集器會自動選擇年輕代區(qū)大小和相應(yīng)的Survivor區(qū)比例,以達到目標(biāo)系統(tǒng)規(guī)定的最低相應(yīng)時間或者收集頻率等制恍,此值建議使用并行收集器時父能,一直打開。
好了净神,到此我對虛擬機的垃圾回收策略總結(jié)就這么多何吝。還是這句話:優(yōu)化的學(xué)習(xí)一直在路上。
本人免費整理了Java高級資料强挫,涵蓋了Java岔霸、Redis、MongoDB俯渤、MySQL呆细、Zookeeper、Spring Cloud、Dubbo高并發(fā)分布式等教程絮爷,一共30G趴酣,需要自己領(lǐng)取。
傳送門:https://mp.weixin.qq.com/s/igMojff-bbmQ6irCGO3mqA