一、實現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性能優化