Spark:
1. 对于垃圾回收的性能问题,首先要做的就是,使用高效的数据结构。
2. 持久化RDD时,使用序列化的持久化级别,而且使用Kyro序列化类库,这样partition就只是一个对象,一个字节数组。
3. 给Eden区域分配更大的空间,使用-Xmn即可,通常建议给Eden区域,预计大小的4/3
如果使用的是HDFS文件,那么很好估计Eden区域的大小,如果每个executor有4个task,然后每个hdfs压缩块解压缩后大小是3倍,此外每个hdfs块的大小是64M,那么Eden区域的预计大小就是:4*3*64M,然后通过-Xmn参数,将Eden区域的大小设置为4*3*64*3/4。
Hbase:
对垃圾回收的优化,RegionServer因为GC的原因不能分配太大的堆内存,20~24GB或者更小比较适合。堆的大小通过export HBASE_HEAPSIZE=xxx来设置。指定新生代的空间:-Xmn512m年
轻代的空间不能太小,也不能太大。太小的话容易在老生代中产生很多碎片,太大的话会使年轻代中的垃圾收集时间过长。HBase官网给出的一个建议是512M。提高IHOP:-XX:InitiatingHeapOccupancyPercent=xx(默认为45)。对CMS收集器的优化,在CMS工作时,不断有对象进入持久代,导致持久代空间不足,这时会放弃原本并行执行的垃圾收集,转而使用stop-the-world的复制算法。为了避免是由老年代内存碎片问题导致的空间不足问题。可以配置以下参数:
-XX:CMSInitiatingOccupancyFraction=70
这个参数的意思是,当老年代的空间分配了70%的时候就开始进行CMS垃圾收集,在一定程度上避免提升失败