美文网首页程序员阿里云
Netty Unpooled 内存分配

Netty Unpooled 内存分配

作者: 良辰美景TT | 来源:发表于2018-12-10 16:06 被阅读3次

    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创建流程

    相关文章

      网友评论

        本文标题:Netty Unpooled 内存分配

        本文链接:https://www.haomeiwen.com/subject/qawxcqtx.html