似乎netty 4.0.24.final可以使用Unpooled
和UnpooledByteBufAllocator
来分配未池化的缓冲区。为什么2?何时使用哪个?
我深入了解Netty 4.0.24.Final的源代码。到目前为止,这是我的发现。
Netty的理念是通过少量接口/抽象类来展示广泛的功能。所以我从抽象类ByteBuf
开始。
类型层次结构如下所示:
因此ByteBuf
可归类为Pooled || Unpooled
或Direct || Heap
。
Unpooled
类的实现如下:
在ALLOC
中使用Unpooled
来分配缓冲区。
所以我认为Unpooled
和UnpooledByteBufferAllocator
密切相关。
有些问题仍未解决:
为什么netty的设计师不像UnpooledByteBuf<T>
那样在层次结构中引入PooledByteBuf<T>
?这将使类型层次结构更加对称。
似乎Unpooled
包裹了UnpooledByteBufAllocator
,为什么需要两者?
答案 0 :(得分:2)
PooledByteBuf<T>
是一个抽象父级,它包含Direct,UnsafeDirect和Heap实现共有的大部分池逻辑。未汇集的版本没有共享的通用逻辑。这就是不对称可能来自的地方。
一般来说,缓冲区分配器不应该直接实例化。它们可以设置为ChannelOption
,并且在您的频道的整个生命周期中,无论何时调用channel.alloc()
,都将返回在频道构建时设置的实例。你应该主要使用那个。它是否合并/非合并,直接安全/不安全或基于堆取决于Netty的默认值,您的配置和您正在运行的平台。
Unpooled
是首选方式,如果您不能或不想调用channel.alloc()
,因为它会让您免除检查平台相关内容的负担,例如使用Unsafe
时wrappedBuffer()
。话虽如此,在一天结束时它确实是一个实用工具类,你可以用手工完成所有工作,但你为什么要这样做呢?
答案 1 :(得分:0)
看起来Unpooled只是一个静态助手类,可用于创建非池化的bytebufer实例......