1. 程式人生 > 實用技巧 >Rocketmq的啟動jvm配置解析-runbroker.sh

Rocketmq的啟動jvm配置解析-runbroker.sh

#設定-Xms初始化堆大小,-Xmx最大堆記憶體大小,-Xmn新生代大小為4G,注意整個堆大小是新生代+老年代+持久代
#新生代的大小會影響老年代的大小,而老年代進行垃圾回收是fullGC,過小會增加頻率,影響系統性能,sun公司推薦設定為java堆的3/8的大小
#不過,如果老年代過大也會導致每一次fullGC的時間過長,但是太小也會導致gullGC的頻率過多,需要根據情況設定
#把初始化堆大小和最大堆大小保持一致,是避免每次GC之後重新分割計算堆區的大小而浪費資源
JAVA_OPT="${JAVA_OPT} -server -Xms8g -Xmx8g -Xmn4g"


#使用G1垃圾回收器來做分代回收,對新生代和老年代都是使用G1
#設定了G1的region大小為16m,因為機器記憶體較多,可以調大到16m(這裡rocketmq預設調為16m,不然2m的region會導致region數量過多)
#在G1管理的老年代裡預留25%的空閒空間,保障新生代物件晉升到老年代有足夠的空間,避免老年代記憶體都滿了
#initiatingHeapOccupancyPercent引數,當堆記憶體的使用率達到30%之後會自動啟動G1的併發垃圾回收,預設值是45%,這裡調低提高了GC的頻率,但是避免了垃圾物件過多,一次垃圾回收時間過長
#soft引數,軟引用物件的回收的引數,預設為0,會頻繁的回收一些軟引用的Class物件,可以調大一些
JAVA_OPT="${JAVA_OPT} -XX:+UseG1GC -XX:G1HeapRegionSize=16m -XX:G1ReservePercent=25 -XX:InitiatingHeapOccupancyPercent=30 -XX:SoftRefLRUPolicyMSPerMB=1000"

#這裡一堆引數都是控制檯GC日誌列印輸出的
JAVA_OPT="${JAVA_OPT} -verbose:gc -Xloggc:${GC_LOG_DIR}/rmq_broker_gc_%p_%t.log -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCApplicationStoppedTime -XX:+PrintAdaptiveSizePolicy"
JAVA_OPT="${JAVA_OPT} -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=5 -XX:GCLogFileSize=30m"

#這個引數是說,有時候JVM會拋棄一些異常堆疊資訊,因此這個引數設定之後,就是禁用這個特性,要把完整的異常堆疊資訊完整的打印出來
JAVA_OPT="${JAVA_OPT} -XX:-OmitStackTraceInFastThrow"

#一般沒有這個引數的時候我們指定JVM的記憶體是多少,但不會真正分配給他,只有實際用到的時候才會分配,使用這個引數,就是強制讓jvm啟動的時候直接分配給我們指定的記憶體
JAVA_OPT="${JAVA_OPT} -XX:+AlwaysPreTouch"

#Rocketmq大量使用了NIO中的direct buffer,這裡限定了最多可以申請多少的記憶體,機器好,可以調大
JAVA_OPT="${JAVA_OPT} -XX:MaxDirectMemorySize=15g"

#這兩個引數的意思就是禁用了大記憶體頁和偏向鎖.
JAVA_OPT="${JAVA_OPT} -XX:-UseLargePages -XX:-UseBiasedLocking"