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