#設置-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"