Netty源码_UnpooledHeapByteBuf详解

Posted

tags:

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

参考技术A 本篇文章我们讲解缓存区 ByteBuf 八大主要类型中两种,未池化堆缓冲区 UnpooledHeapByteBuf 和 未池化不完全堆缓冲区 UnpooledUnsafeHeapByteBuf

UnpooledHeapByteBuf 是 java 堆缓冲区的实现,而且它推荐使用 UnpooledByteBufAllocator.heapBuffer(int, int) , Unpooled.buffer(int) 和 Unpooled.wrappedBuffer(byte[]) 方式创建 UnpooledHeapByteBuf ,而不是直接调用它的构造方法 new 出来。

有三个成员属性:

它有两个构造方法,一个是创建的时候没有内容,一个创建的时候就带有内容数据。

分配新的字节数组。

替换缓存区的字节数组 array ,必须将 tmpNioBuf 设置为 null 。

你会发现最后都是调用 HeapByteBufUtil 对应方法,这个类 HeapByteBufUtil 我们后面再说。

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

FileChannel 就是 GatheringByteChannel 的子类。

都是调用 HeapByteBufUtil 对应方法,这个类 HeapByteBufUtil 我们后面再说。

我们知道这个方法是在 AbstractReferenceCountedByteBuf 类中定义的,当引用计数变成 0 的时候,就会调用这个 deallocate() 方法,释放持有的资源。

仔细阅读 UnpooledUnsafeHeapByteBuf 源码,你会发现这个类很简单,它是 UnpooledHeapByteBuf 的子类,与 UnpooledHeapByteBuf 区别就两个方面。

UnpooledUnsafeHeapByteBuf 是通过 PlatformDependent.allocateUninitializedArray 创建数组,利用 Unsafe 来加快数据的访问。

UnpooledUnsafeHeapByteBuf 是通过 UnsafeByteBufUtil 工具类获取基本数据类型的数据。

先明确一个概念,什么是大端,什么是小端。

例如获取 short

就是通过右移位运算和 或 | 位运算,实现数的拼接。

利用左移位运算,将高位数据转换成 byte 类型存储;再使用 (byte) 类型强转,只保留低八位的数据存储。

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

Netty源码_UnpooledHeapByteBuf详解

Netty源码_ChannelPipeline和ChannelHandlerContext详解

Netty源码_内存管理(jemalloc4)

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

NettyNetty源码编译

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