1 为什么要优化垃圾回收?
写入负载高时,繁重的负载会迫使内存分配策略无法安全的只依赖JRE对程序行为的各种假设:需要调整JRE的参数来调整垃圾回收策略。
2 JVM堆内存怎么出现孔洞?
写入的数据时客户端在不同时间写入的。
参阅:JVM运行原理 http://blog.csdn.net/bingduanlbd/article/details/8363734
JVM垃圾回收器 http://my.oschina.net/u/128568/blog/264257
3 hbase中怎么设置JVM参数?
1 hbase_env.sh 中 HBASE_OPTS或者HBASE_REGIONSERVER_OPT变量来设置垃圾回收的选项。推荐使用后者。
2 设置新生代大小的参数,不能过小,过小则导致年轻代过快成为老生代,引起老生代产生内存随便。
不能过大,过大导致所有的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