本文旨在簡明扼要說明各回收器調優參數,如有疏漏歡迎指正。 #### 1、JDK版本 以下所有優化全部基於JDK8版本,強烈建議低版本升級到JDK8,並儘可能使用update_191以後版本。 #### 2、如何選擇垃圾回收器 響應優先應用:面向C端對響應時間敏感的應用,堆記憶體8G以上建議選擇G1,堆 ...
本文旨在簡明扼要說明各回收器調優參數,如有疏漏歡迎指正。
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配置。
作者:京東零售 王利輝
來源:京東雲開發者社區