Unpooled和UnpooledByteBufAllocator之间的区别是什么?

时间:2015-02-21 14:00:49

标签: netty

似乎netty 4.0.24.final可以使用UnpooledUnpooledByteBufAllocator来分配未池化的缓冲区。为什么2?何时使用哪个?

ADD 1

我深入了解Netty 4.0.24.Final的源代码。到目前为止,这是我的发现。

Netty的理念是通过少量接口/抽象类来展示广泛的功能。所以我从抽象类ByteBuf开始。

类型层次结构如下所示:

enter image description here

因此ByteBuf可归类为Pooled || UnpooledDirect || Heap

Unpooled类的实现如下:

enter image description here

ALLOC中使用Unpooled来分配缓冲区。

所以我认为UnpooledUnpooledByteBufferAllocator密切相关。

有些问题仍未解决:

  • 为什么netty的设计师不像UnpooledByteBuf<T>那样在层次结构中引入PooledByteBuf<T>?这将使类型层次结构更加对称。

  • 似乎Unpooled包裹了UnpooledByteBufAllocator,为什么需要两者?

2 个答案:

答案 0 :(得分:2)

PooledByteBuf<T>是一个抽象父级,它包含Direct,UnsafeDirect和Heap实现共有的大部分池逻辑。未汇集的版本没有共享的通用逻辑。这就是不对称可能来自的地方。

一般来说,缓冲区分配器不应该直接实例化。它们可以设置为ChannelOption,并且在您的频道的整个生命周期中,无论何时调用channel.alloc(),都将返回在频道构建时设置的实例。你应该主要使用那个。它是否合并/非合并,直接安全/不安全或基于堆取决于Netty的默认值,您的配置和您正在运行的平台。

Unpooled是首选方式,如果您不能或不想调用channel.alloc(),因为它会让您免除检查平台相关内容的负担,例如使用UnsafewrappedBuffer()。话虽如此,在一天结束时它确实是一个实用工具类,你可以用手工完成所有工作,但你为什么要这样做呢?

答案 1 :(得分:0)

看起来Unpooled只是一个静态助手类,可用于创建非池化的bytebufer实例......