Netty 什么';Unlooled和UnlooledByteBuff分配器之间的区别是什么?

Netty 什么';Unlooled和UnlooledByteBuff分配器之间的区别是什么?,netty,Netty,似乎netty 4.0.24.final既有未冷却的,又有未冷却的缓冲区分配器可用于分配未冷却的缓冲区。那为什么是2?什么时候用哪个 加1 我深入研究了Netty 4.0.24.Final的源代码。以下是我到目前为止的发现 Netty的理念是通过少量的接口/抽象类公开广泛的功能。所以我从抽象类ByteBuf开始 类型层次结构如下所示: 因此,ByteBuf可以分为poold | | unpoled或Direct | | Heap unoled类的实现方式如下: ALLOC用于unmooled

似乎netty 4.0.24.final既有
未冷却的
,又有
未冷却的缓冲区分配器
可用于分配未冷却的缓冲区。那为什么是2?什么时候用哪个

加1 我深入研究了Netty 4.0.24.Final的源代码。以下是我到目前为止的发现

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

类型层次结构如下所示:

因此,
ByteBuf
可以分为
poold | | unpoled
Direct | | Heap

unoled
类的实现方式如下:

ALLOC
用于
unmooled
分配缓冲区

所以我认为
unoled
unoledbytebufferallocator
是密切相关的

一些问题仍然悬而未决:

  • 为什么netty的设计者不在层次结构中引入一个
    unmoledbytebuf
    ,就像
    PooledByteBuf
    一样?这将使类型层次结构更加对称

  • 似乎
    unoled
    有点像是包装了
    unoledbytebufallocator
    ,那么为什么两者都需要呢


看起来unmooled只是一个静态助手类,可用于创建unmooled ByteBuffer实例

PooledByteBuf
是一个抽象父级,它保存了大多数池逻辑,这些逻辑对于直接、非安全直接和堆实现是通用的。非制冷版本没有共享的通用逻辑。这就是不对称性的可能来源

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


如果您不能或不想调用
channel.alloc()
,则
unmooled
是首选方法,因为它将免除您在使用
wrappedBuffer()
时检查与平台相关的事物(如
不安全的
)的负担。话虽如此,归根结底,它确实是一个实用类,您可能可以手工完成所有这些,但您为什么要这样做?

@trustin对Netty 4缓冲区管理进行更详细的解释将不胜感激。维护人员可能应该将其重命名为unoledeutils或其他什么