博客 / 詳情

返回

淺析JVM GC配置指南 | 京東雲技術團隊

本文旨在簡明扼要説明各回收器調優參數,如有疏漏歡迎指正。

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配置。

作者:京東零售 王利輝

來源:京東雲開發者社區

user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.