Netty源码_UnpooledHeapByteBuf详解
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Netty源码_UnpooledHeapByteBuf详解相关的知识,希望对你有一定的参考价值。
参考技术A 本篇文章我们讲解缓存区 ByteBuf 八大主要类型中两种,未池化堆缓冲区 UnpooledHeapByteBuf 和 未池化不完全堆缓冲区 UnpooledUnsafeHeapByteBufUnpooledHeapByteBuf 是 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源码_ChannelPipeline和ChannelHandlerContext详解