1. 程式人生 > >Tomcat 和 JVM 的效能調優總結

Tomcat 和 JVM 的效能調優總結

Tomcat效能調優:

       找到Tomcat根目錄下的conf目錄,修改server.xml檔案的內容。對於這部分的調優,我所瞭解到的就是無非設定一下Tomcat伺服器的最大併發數和Tomcat初始化時建立的執行緒數的設定,當然還有其他一些效能調優的設定,下圖是我根據我機子的效能設定的一些引數值,給各位詳細解釋一下吧:

       1、URIEncoding="UTF-8"設定Tomcat的字符集。這種配置我們一般是不會設定的,因為關於亂碼的轉換我們會在具體專案中具體處理,直接修改Tomcat的字符集未免過於太死板。

       2、maxThreads="300" :設定當前Tomcat的最大併發數。Tomcat預設配置的最大請求數是150個,即同時能支援150個併發。但是在實際運用中,最大併發數與硬體效能和CPU數量都有很大關係的,更好的硬體、更高的處理器都會使Tomcat支援更多的併發數。如果一般在實際開發中,當某個應用擁有 250 個以上併發的時候,都會考慮到應用伺服器的叢集。

       3、minSpareThreads="50" :設定當前Tomcat初始化時建立的執行緒數,預設值為25。

       4、acceptCount="250" :當同時連線的人數達到maxThreads引數設定的值時,還可以接收排隊的連線數量,超過這個連線的則直接返回拒絕連線。指定當任何能夠使用的處理請求的執行緒數都被使用時,能夠放到處理佇列中的請求數,超過這個數的請求將不予處理。預設值為100。在實際應用中,如果想加大Tomcat的併發數 ,應該同時加大acceptCount和maxThreads的值

       5、enableLookups="false" :是否開啟域名反查,一般設定為false來提高處理能力,它的取值還有true,一般很少使用。

       6、maxKeepAliveRequests="1" :nginx動態的轉給tomcat,nginx是不能keepalive的,而tomcat端預設開啟了keepalive,會等待keepalive的timeout,預設不設定就是使用connectionTimeout。 所以必須設定tomcat的超時時間,並關閉tomcat的keepalive。否則會產生大量tomcat的socket timewait。 maxKeepAliveRequests=”1”就可以避免tomcat產生大量的TIME_WAIT連線,從而從一定程度上避免tomcat假死

JVM效能調優:

       Tomcat本身還是執行在JVM上的,通過對JVM引數的調整我們可以使Tomcat擁有更好的效能。目前針對JVM的調優主要有兩個方面:

記憶體調優和垃圾回收策略調優。

一:記憶體調優  找到Tomcat根目錄下的bin目錄,設定catalina.sh檔案中JAVA_OPTS變數即可,因為後面的啟動引數會把JAVA_OPTS作為JVM的啟動引數來處理。再說Java虛擬機器的記憶體結構是有點複雜的,相信很多人在理解上都是很抽象的,它主要分為堆、棧、方法區和垃圾回收系統等幾個部分組成,下面是我從網上扒的記憶體結構圖:

記憶體調優這塊呢,無非就是通過修改它們各自的記憶體空間的大小,使應用能夠更加合理的運用,下圖是我根據我機子的效能設定的引數,給各位詳細解釋一下各個引數的含義吧:

       1、-Xmx512m :設定Java虛擬機器的的最大可用記憶體大小,單位:兆(m),整個堆大小=年輕代大小 + 年老代大小 + 持久代大小。持久代一般固定大小為64m。堆的不同分佈情況,對系統會產生一定的影響。儘可能將物件預留在新生代,減少老年代GC的次數(通常老年回收起來比較慢)。實際工作中,通常將堆的初始值和最大值設定相等,這樣可以減少程式執行時進行的垃圾回收次數和空間擴充套件,從而提高程式效能。

       2、-Xms512m :設定Java虛擬機器的的初始值記憶體大小,單位:兆(m),此值可以設定與-Xmx相同,以避免每次垃圾回收完成後JVM重新分配記憶體。 

       3、-Xmn170m :設定年輕代記憶體大小,單位:兆(m),此值對系統性能影響較大,Sun官方推薦配置為整個堆的3/8。一般在增大年輕代記憶體後,也會將會減小年老代大小

       4、-Xss128k :設定每個執行緒的大小。JDK5.0以後每個執行緒棧大小為1M,以前每個執行緒棧大小為256K。更具應用的執行緒所需記憶體大小進行調整。在相同實體記憶體下,減小這個值能生成更多的執行緒。但是作業系統對一個程序內的執行緒數還是有限制的,不能無限生成,經驗值在3000~5000左右。

       5、 -XX:NewRatio=4 :設定年輕代(包括Eden和兩個Survivor區)與年老代的比值(除去持久代)。設定為4,則年輕代與年老代所佔比值為1:4,年輕代佔整個堆疊的1/5 。

       6、-XX:SurvivorRatio=4 :設定年輕代中Eden區與Survivor區的大小比值。設定為4,則兩個Survivor區與一個Eden區的比值為2:4,一個Survivor區佔整個年輕代的1/6。

       7、-XX:MaxPermSize=16m :設定持久代大小為16m,上面也說了,持久代一般固定的記憶體大小為64m。

       8、-XX:MaxTenuringThreshold=0:設定垃圾最大年齡。如果設定為0的話,則年輕代物件不經過Survivor區,直接進入年老代。對於年老代比較多的應用,可以提高效率。如果將此值設定為一個較大值,則年輕代物件會在Survivor區進行多次複製,這樣可以增加物件再年輕代的存活時間,增加在年輕代即被回收的概論。

二:垃圾回收策略調優  找到Tomcat根目錄下的bin目錄,也是設定catalina.sh檔案中JAVA_OPTS變數即可。我們都知道Java虛擬機器都有預設的垃圾回收機制,但是不同的垃圾回收機制的效率是不同的,正是因為這點我們才經常對Java虛擬機器的垃圾回收策略進行相應的調整。下面也是通過我的一些需求來配置的垃圾回收策略:

       Java虛擬機器的垃圾回收策略一般分為:序列收集器、並行收集器和併發收集器

序列收集器:

       1、-XX:+UseSerialGC:代表垃圾回收策略為序列收集器,即在整個掃描和複製過程採用單執行緒的方式來進行,適用於單CPU、新生代空間較小及對暫停時間要求不是非常高的應用上,是client級別預設的GC方式,主要在JDK1.5之前的垃圾回收方式

併發收集器:

       1、-XX:+UseParallelGC:代表垃圾回收策略為並行收集器(吞吐量優先),即在整個掃描和複製過程採用多執行緒的方式來進行,適用於多CPU、對暫停時間要求較短的應用上,是server級別預設採用的GC方式。此配置僅對年輕代有效。該配置只能讓年輕代使用併發收集,而年老代仍舊使用序列收集。 

       2、-XX:ParallelGCThreads=4:配置並行收集器的執行緒數,即:同時多少個執行緒一起進行垃圾回收。此值最好配置與處理器數目相等。 

       3、-XX:+UseParallelOldGC:配置年老代垃圾收集方式為並行收集。JDK6.0支援對年老代並行收集 。

       4、-XX:MaxGCPauseMillis=100 :設定每次年輕代垃圾回收的最長時間,如果無法滿足此時間,JVM會自動調整年輕代大小,以滿足此值。

       5、-XX:+UseAdaptiveSizePolicy:設定此選項後,並行收集器會自動選擇年輕代區大小和相應的Survivor區比例,以達到目標系統規定的最低相應時間或者收集頻率等,此值建議使用並行收集器時,一直開啟。

併發收集器:

       1、-XX:+UseConcMarkSweepGC:代表垃圾回收策略為併發收集器。

好了,到此我對虛擬機器的垃圾回收策略總結就這麼多,還是這句話:優化的學習一直在路上,下面還有一張從其他部落格中偷到的圖,據說以上三種GC機制是需要配合使用的。

[註明:本文中的調優引數都是個人根據自己的需求配置,並且都是測試通過的,如果需要,則根據自己實際情況配置引數大小。]