1 爲何要優化垃圾回收? web
寫入負載高時,繁重的負載會迫使內存分配策略沒法安全的只依賴JRE對程序行爲的各類假設:須要調整JRE的參數來調整垃圾回收策略。安全
2 JVM堆內存怎麼出現孔洞?併發
寫入的數據時客戶端在不一樣時間寫入的。優化
參閱:JVM運行原理 http://blog.csdn.net/bingduanlbd/article/details/8363734spa
JVM垃圾回收器 http://my.oschina.net/u/128568/blog/264257.net
3 hbase中怎麼設置JVM參數?日誌
1 hbase_env.sh 中 HBASE_OPTS或者HBASE_REGIONSERVER_OPT變量來設置垃圾回收的選項。推薦使用後者。orm
2 設置新生代大小的參數,不能太小,太小則致使年輕代過快成爲老生代,引發老生代產生內存碎片。blog
不能過大,過大致使全部的JAVA進程中止時間長。 -XX:MaxNewSize=128m -XX:NewSize=128m進程
3 設置垃圾回收日誌,打印日誌,可以看到新生代提高到老生代失敗的信息。"concurrent mode failure",'promotion failed"
-verbose:gc -XX: +PrintGCDetails -XX:+PrintGCTimeStamps \
-Xloggc:$HBASE_HOME/logs/gc-$(hostname)-hbase.log
4 設置垃圾回收策略
-XX:+UseParNewGC -XX:+UseConcMarkSweepGC
5 設置CMS的值,佔比多少時,開始併發標記和清掃檢查。
綜上:export HBASE_REGIONSERVER_OPT ="-Xmx8g -Xms8g -Xmn128m -XX:+UseParNewGC -XX:+UseConcMarkSweepGC \
-XX:CMSInitiatingOccupancyFraction=70 -verbose:gc \
-XX: +PrintGCDetails -XX:+PrintGCTimeStamps \
-Xloggc:$HBASE_HOME/logs/gc-$(hostname)-hbase.log