Jvm使用过程中,一个比较重要的概念就是GC,Hbase是使用JAVA语言开发的,JVM的GC优化也是比较重要的一个优化方法。Hbase中对于写的数据key/value大小不固定,有可能有很对比较小即大小的key/value,就有很大的概率产生jvm内存碎片问题。举个例子:
当Jvm new一个2K大小的对象,JVM将无从heap分配它,因为找不到连续可用的内存空间来容纳这个对象,就算Heap当时还有500M的剩余空间,也无能为力。最终,JVM会选择触发Full GC重新压缩内存使之连续,然后再分配。
即触发Full GC,并不只有在内存满或达到触发比例的时候,还有可能是因为内存碎片。
产生内存碎片的主要原因是:
- 分配的大小不一。
- 分配的空间不连续。
如何检测因内存碎片触发了Full GC?
通过启动jvm时,添加 -XX:PrintFLSStatistics=1 参数来打印每次gc前后的Heap余量。较大的余量,可以怀疑Heap中存在内存碎片过多。
另外这篇blog有更详细的图文