HBase堆外内存使用解析

背景

JVM需要申请一块内存用于进程的使用,类、对象、方法等数据均保存在JVM堆栈也就是申请的这块内存之中,JVM也会负责帮我们管理和回收再利用这块内存。

相对的,堆外内存就是直接调用系统malloc分配的内存,这部分内存不属于JVM直接管理,也不受JVM最大内存的限制,通过引用指向这段内存。

堆外内存可以带来更小的GC压力,更少的内存碎片,以及零拷贝方面的性能优化。HBase在读写路径上都进行了堆外内存的优化。

目前HBase的堆外内存主要应用在4部分:MSLAB,Bucket cache,RPC,HDFS读写数据。

但是堆外内存需程序主动管理和释放。所以我们需要了解HBase堆外内存的使用和配置,以尽可能少的减少堆外内存配置不当带来的问题。

HBase内存管理整体架构

hbase offheap.png

下面主要详细解释HBase的堆外内存使用部分,按图中的标号分别描述。

HBase堆外内存分配器

HBase的堆外内存分两种类型,一种是Netty的NIO ByteBuffer,一种是Java的DirectByteBuffer。(测试性能后者较好)

堆外内存分配器分为3种:

  1. HBase自定义的仿Netty的堆外内存分配器ByteBuffAllocator,采用引用计数归零后重复利用的机制;

  2. 直接用JVM分配的一大块DirectByteBuffer,内部按一定的大小分页,采用淘汰后再重复利用的机制;

  3. 采用Netty堆外内存池PooledByteBufAllocator.DEFAULT分配的NIO ByteBuffer,由Netty管理;

1. HBase自定义的ByteBuffAllocator

目前是RS级别的内存分配器,返回包装了的Java ByteBuffer内存的分配池,分配NIO堆外内存和堆内内存。

如需申请堆外内存块,会优先从池子中拿,池子中不够时创建,已有内存块数量达到最大时,就是申请堆内的内存了。

1.1 应用

目前使用ByteBuffAllocator分配内存的地方有两处:

1. 从HFile读出data block和RAM cache中的block。每个data block会尽可能存储在一个堆外内存块中,以高效利用hadoop native lib的checksum。

而不足最小存储堆外内存大小的数据,会在堆内分配。如果表自定义的data block大小大于这里定义的堆外内存块大小,则每个data block可能占用多个堆外内存块和一部分堆内内存。

2.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值