前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Netty Unpooled 内存分配

Netty Unpooled 内存分配

作者头像
良辰美景TT
发布2018-12-25 14:39:23
1.8K0
发布2018-12-25 14:39:23
举报

Netty里的内存管理是通过ByteBuf这个类作为桥梁连接着业务代码与jdk底层的内存。所以理解ByteBuf的结构就很有必要了。

ByteBuf

ByteBuf的内部结构如下图:

这里通过两个指针,readerIndex与writerIndex分别指向已经读到的位置和写入的位置,比JDK提供的ByteBuffer 省了flip操作。类结构如图所示:

ByteBuf类结构图

ByteBuf分类
  • Pooled和Unpooled:pooled类型的bytebuf是在已经申请好的内存块取一块内存,而Unpooled是直接通过JDK底层代码申请。
  • Unsafe和非Unsafe:这里的Unsafe是JDK底层的对象,通过它能够直接操作到内存。
  • Heap和Direct:一个是在堆上分配,一个是直接内存。Direct不受GC的控制。
ByteBufAllocator

ByteBuf对象是通过ByteBufAllocator来进行生成的,其中AbstractByteBufAllocator里实现在大部分的功能,具体是pooled还是unpooled类型的byteBuf是留给相应的子类来实现的,而Heap和Direct是通过暴露不同的接口来区分的,Unsafe与非Unsafe是通过JDK内部的平台来进行判断是否能生成Unsafe类的ByteBuf。ByteBufAllocator类图如下:

ByteBufAllocator类图

UnpooledByteBufAllocator分配heap内存
  • 通过调用heapBuffer方法分配一块heap内存

AbstractByteBufAllocator的heapBuffer方法

  • 根据平台是否支持unsafe操作,生成不同的对象
  • unsafe类的构造过程
  • 非unsafe类型的直接调用new byte[]构造
  • unsafe类型的byteBuf申请内存对象
Unsafe与非Unsafe类型的byteBuf内部实现上的差异
  • 非unsafe的getByte方法
  • unsafe的getByte方法

image.png

UnpooledByteBufAllocator分配direct内存
  • UnpooledByteBufAllocator类的newDirectBuffer方法
  • UnpooledUnsafeDirectByteBuf创建流程
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018.12.10 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • ByteBuf
    • ByteBuf分类
    • ByteBufAllocator
      • UnpooledByteBufAllocator分配heap内存
        • Unsafe与非Unsafe类型的byteBuf内部实现上的差异
          • UnpooledByteBufAllocator分配direct内存
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档