Tomcat的GC優化實踐

一、實現Tomcat的gc優化

Tomcat運行java web程序,如果只是滿足功能要求,那麼無需調節性能。但是,應用上生產後,稍微一點的優化都會產生產生巨大的效率提升。所以,Tomcat的優化是必須的,其中gc優化又是關鍵一條。

二、環境

tomcat8.0+

jdk1.8

三、設置Tomcat不同gc策略並且對比結果


1.設置並行垃圾回收器

修改bin/catalina.sh文件,添加下面的到250行左右的位置。

#年輕代、老年代均使用並行收集器,初始堆內存64M,最大堆內存512M
JAVA_OPTS="-XX:+UseParallelGC -XX:+UseParallelOldGC -Xms64m -Xmx512m -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCDateStamps -XX:+PrintHeapAtGC -Xloggc:/home/hadoop/server/apache-tomcat-app/logs/gc.log"

備註:-Xloggc垃圾回收日誌位置,最好指定絕對路徑,如果使用../的相對路徑,經過測試無法輸出gc.log文件,而且本身會報錯找不到該路徑。

2.獲得gc日誌上傳gceasy.io進行分析

2.1 系統所消耗的時間大於用戶時間(自身沒有發現)

 
如果在報告中顯示System Time greater than User Time,系統所消耗的時間大於用戶時間,這反應出的服務器的性能存在瓶頸,調度CPU等資源所消耗的時間要長一些

2.2查看JVM內存大小

 
2.3查看Key Performance Indicators,查看吞吐量和垃圾回收平均時間

2.4 GC總次數統計

 
結果分析:

(1)年輕代gc有52次,比較多,說明年輕代設置不合適,比較小,需要調整。
(2)Fullgc有2次,可以選擇調整或者不調整。


2.5統計網站給出的可能原因

 
年輕代內存不足導致頻繁jc。

3.優化配置,提升年輕代大小

JAVA_OPTS="-XX:+UseParallelGC -XX:+UseParallelOldGC -Xms128m -Xmx1024m -XX:NewSize=64m -XX:MaxNewSize=256m -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCDateStamps -XX:+PrintHeapAtGC -Xloggc:/home/hadoop/server/apache-tomcat-app/logs/gc.log"

4.獲取優化後gc日誌,同樣上傳gceasy.io進行分析

4.1 查看常規JVM配置

4.2 查看關鍵KPI(Key Performance Indicators)

 
最大回收時間減少,總體回收次數也從57減少到38,起到一定優化作用。

4.3 查看GC總數統計

 
無論minor gc還是full gc都是有減少。所以,說明優化有效。

4.4 查看最終分析原因

5.後續優化

5.1 設置G1垃圾回收器

#設置了最大停頓時間100毫秒,初始堆內存128m,最大堆內存1024m
JAVA_OPTS="-XX:+UseG1GC -XX:MaxGCPauseMillis=100 -Xms128m -Xmx1024m -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCDateStamps -XX:+PrintHeapAtGC -Xloggc:../logs/gc.log"

5.2 JVM最佳配置,僅作參考

JAVA_OPTS="-Dfile.encoding=UTF-8-server -Xms1024m -Xmx2048m -XX:NewSize=512m -XX:MaxNewSize=1024m -XX:PermSize=256m -XX:MaxPermSize=256m -XX:MaxTenuringThreshold=10-XX:NewRatio=2 -XX:+DisableExplicitGC"

參數說明

file.encoding 默認文件編碼

-Xmx1024m 設置JVM最大可用內存爲1024MB

-Xms1024m 設置JVM最小內存爲1024m。此值可以設置與-Xmx相同,以避免每次垃圾回收完成後JVM重新分配內存。

-XX:NewSize 設置年輕代大小

-XX:MaxNewSize 設置最大的年輕代大小

-XX:PermSize 設置永久代大小

-XX:MaxPermSize 設置最大永久代大小

-XX:NewRatio=4 設置年輕代(包括Eden和兩個Survivor區)與終身代的比值(除去永久代)。設置爲4,則年輕代與終身代所佔比值爲1:4,年輕代佔整個堆棧的1/5

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

-XX:+DisableExplicitGC 這個將會忽略手動調用GC的代碼使得System.gc()的調用就會變成一個空調用,完全不會觸發任何GC。

三、參考

1. 史上最強Tomcat8性能優化

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章