本文旨在簡明扼要説明各回收器調優參數,如有疏漏歡迎指正。
1、JDK版本
以下所有優化全部基於JDK8版本,強烈建議低版本升級到JDK8,並儘可能使用update_191以後版本。
2、如何選擇垃圾回收器
響應優先應用:面向C端對響應時間敏感的應用,堆內存8G以上建議選擇G1,堆內存較小或低版本JDK選擇CMS;
吞吐量優先應用:對響應時間不敏感,以高吞吐量為目標的應用(如MQ、Worker),建議選擇ParallelGC;
3、各回收器優化參數
1)基本參數配置(所有應用、所有回收器都需要):
-Xmx(一般為容器內存的50%)
-Xms(與Xmx一致)
-XX:MetaspaceSize(通常256M~512M)
-XX:ParallelGCThreads=容器核數
-XX:CICompilerCount=容器核數(必須大於等於2)
2)ParallelGC
除以上參數外,一般不需要額外調優(JDK8默認回收器)
3)CMS
-XX:+UseConcMarkSweepGC
-Xmn (一般為堆內存的三分之一),尤其是配置了ParallelGCThreads後必須配置此參數
-XX:ConcGCThreads=n(默認為ParallelGCThreads/4,可視情況調整至ParallelGCThreads/2)
-XX:+UseCMSInitiatingOccupancyOnly
-XX:CMSInitiatingOccupancyFraction=70(推薦值)
4)G1
-XX:+UseG1GC
-XX:ConcGCThreads=n(默認為ParallelGCThreads/4,可視情況調整至ParallelGCThreads/2)
-XX:G1HeapRegionSize=8m(若堆內存在8G以內且有較多大對象推薦設置此值)
*注意不要設置-Xmn 和 XX:NewRatio
5)其他調優參數
-XX:+ParallelRefProcEnabled 如果GC時Reference處理時間較長,例如大量使用WeakReference對象,可以通過此參數開啓並行處理
4、開啓GC日誌
-XX:+PrintGCDetails
-XX:+PrintGCDateStamps
-Xloggc:/export/Logs/gc.log
5、如何判斷GC是否正常
1)GC是否頻繁:YoungGC頻率一般幾十秒鐘一次,FullGC一般每天幾次,注意G1回收器不應該出現FullGC;
2)GC耗時:耗時主要取決於堆內存大小及垃圾對象數量。YoungGC時間通常應在幾十毫秒,FullGC通常在幾百毫秒;
3)每次GC內存是否下降:應用剛啓動時,每次YoungGC內存應該回收到較低水位,隨着時間推移老年代逐步增多,內存水位會逐步上漲,直到FullGC/MixedGC(G1),內存會再次回到較低水位,否則可能存在內存泄漏;
4)如果使用ParallelGC,堆內存耗盡才會觸發FullGC,所以不用配置堆內存使用率告警,但需關注GC頻率;
5)泰山上可以巡檢部分JVM配置。
作者:京東零售 王利輝
來源:京東雲開發者社區