Netty 什么';Unlooled和UnlooledByteBuff分配器之间的区别是什么?
似乎netty 4.0.24.final既有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
未冷却的
,又有未冷却的缓冲区分配器
可用于分配未冷却的缓冲区。那为什么是2?什么时候用哪个
加1
我深入研究了Netty 4.0.24.Final的源代码。以下是我到目前为止的发现
Netty的理念是通过少量的接口/抽象类公开广泛的功能。所以我从抽象类ByteBuf
开始
类型层次结构如下所示:
因此,ByteBuf
可以分为poold | | unpoled
或Direct | | Heap
unoled
类的实现方式如下:
ALLOC
用于unmooled
分配缓冲区
所以我认为unoled
和unoledbytebufferallocator
是密切相关的
一些问题仍然悬而未决:
- 为什么netty的设计者不在层次结构中引入一个
,就像unmoledbytebuf
一样?这将使类型层次结构更加对称PooledByteBuf
- 似乎
有点像是包装了unoled
,那么为什么两者都需要呢unoledbytebufallocator
PooledByteBuf
是一个抽象父级,它保存了大多数池逻辑,这些逻辑对于直接、非安全直接和堆实现是通用的。非制冷版本没有共享的通用逻辑。这就是不对称性的可能来源
一般来说,缓冲区分配器不应该直接实例化。它们可以设置为ChannelOption
,并且在频道的整个生命周期内,无论何时调用channel.alloc()
,都将返回在频道构建时设置的实例。你应该主要用那个。它是池化/非池化、直接安全/不安全还是基于堆取决于Netty的默认设置、您的配置和您运行的平台
如果您不能或不想调用
channel.alloc()
,则unmooled
是首选方法,因为它将免除您在使用wrappedBuffer()
时检查与平台相关的事物(如不安全的)的负担。话虽如此,归根结底,它确实是一个实用类,您可能可以手工完成所有这些,但您为什么要这样做?@trustin对Netty 4缓冲区管理进行更详细的解释将不胜感激。维护人员可能应该将其重命名为unoledeutils或其他什么