Netty源码_UnpooledDirectByteBuf详解

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Netty源码_UnpooledDirectByteBuf详解相关的知识,希望对你有一定的参考价值。

参考技术A 本篇文章我们讲解缓存区 ByteBuf 八大主要类型中两种,未池化直接缓冲区 UnpooledDirectByteBuf 和 未池化不安全直接缓冲区 UnpooledUnsafeDirectByteBuf 。

UnpooledDirectByteBuf 一个基于 NIO ByteBuffer 的缓冲区。
建议使用 UnpooledByteBufAllocator.directBuffer(int, int) , Unpooled.directBuffer(int) 和 Unpooled.wrappedBuffer(ByteBuffer) ;而不是显式调用构造函数。

有四个成员属性:

通过 allocateDirect(initialCapacity) 方法创建一个新的 NIO 缓存区实例来初始化此缓存区对象。

利用现有的 NIO 缓存区创建此缓存区。

通过 NIO 缓存区 buffer 对应方法获取基本数据类型数据。

根据目标缓存区 dst 类型不同,处理的方式也不同。

你会发现这些方法都是获取此缓存区对应 NIO 缓存区 ByteBuffer 对象,调用 ByteBuffer 对象的方法,与 IO 流的交互,进行数据传输

和 get 系列方法一样, set 系列的实现也是靠 NIO 缓存区 ByteBuffer 对应方法。

剩余方法也几乎都是和 NIO 缓存区 ByteBuffer 有关,而且也不难,就不做过多介绍了。

UnpooledDirectByteBuf 主要是通过 NIO 缓存区 buffer 来存储数据。而它获取和设置数据,也都是通过 NIO 缓存区对应方法实现的。

光看介绍,和 UnpooledDirectByteBuf 没有任何区别。它也是 UnpooledDirectByteBuf 的子类。

那么 UnpooledUnsafeDirectByteBuf 和 UnpooledDirectByteBuf 不同处在那里呢?

通过复习 setByteBuffer 方法,获取 NIO 缓存区 buffer 对应的直接内存地址。

通过 UnsafeByteBufUtil 对应方法,直接从内存地址获取对应基本类型数据。

通过 UnsafeByteBufUtil 对应方法,直接向内存地址设置对应基本类型数据。

只有这个类型 hasMemoryAddress() 方法才会返回 true 。

UnpooledUnsafeDirectByteBuf 就是通过直接从内存地址中获取和设置数据的方式,提高性能。

以上是关于Netty源码_UnpooledDirectByteBuf详解的主要内容,如果未能解决你的问题,请参考以下文章

Netty源码_UnpooledHeapByteBuf详解

Netty源码_ChannelPipeline和ChannelHandlerContext详解

Netty源码_内存管理(jemalloc4)

netty源码分析(六) - ByteBuf - 2UnpooledByteBufAllocator

NettyNetty源码编译

Netty_04_消息协议设计与实战(实践类)