欢迎大家注意github.com/hsfxuebao。我希望这对每个人都会有所帮助。如果您认为有可能
Java本身提供ByteBuffer类,为什么Netty还参加Bytebuf类?因为ByteBuffer类有许多缺点:
为了弥补这些缺点,Netty提供了自己的缓冲类别来实施Bytebuf。该特征是什么?
BYTEBUF的主要功能继承关系如下图:
从内存分配的角度来看,Bytebuf可以分为两类:
两种类型的内存具有自己的优势和缺点。Netty的最佳实践表明:DirectByteBuf用于I/O通信线程的读取缓冲区中。后端业务消息的编解码器模块使用HeapByTeBuf,因此组合可以实现最佳性能。
从内存恢复的角度来看,BYTEBUF还分为两个类别:基于对象池和普通bytebuf的bytebuf。两者之间的区别在于,基于对象池的bytebuf可以重复使用bytebuf对象。它可以单独维护一个内存池,它可以回收创建的bytebuf,以改善内存的使用并减少由于高负负载而导致的频繁GC。内存池的缺点是管理和维护更为复杂,它们必须是在使用过程中更加谨慎。
让我们分析和解释以下一些关键类别。
AbstractByteBuf做了什么?让我们看一下其主要成员变量:
我们发现没有真正存储数据的数据结构,例如字节数组或DirectByteBuffer,因为不知道子类是基于桩内存还是直接存储器。
接下来,让我们看一下readbytes方法。AbstractBytebuf做了什么?
从当前bytebuf到DST的复制数据是在GetBytes方法中。该方法未在AbstractByteBuf中实现,这也是因为目前的特定存储数据尚不确定。
让我们看一下WriteBytes方法。AbstractByteBuf的操作是什么?
在阅读和写作操作中,AbstractByteBuf主要负责参数验证,读写指针修改以及在写作操作期间的容量扩展计算。
此外,AbstractByteBuf还提供以下功能:
摘要:AbstractByteBuf中的子类中实现的内容。
从类名称可以看出,该类主要提供参考计数的函数,类似于带有JVM内存回收对象的对象参考计数器,该对象用于跟踪对象的分布和回收,以实现对内存的手动控制恢复。
首先,让我们看一下其成员变量:
接下来,让我们看一下增加参考计数的保留方法。该方法是使用cas添加1到1。在添加的添加,refcnt值为0或integer.max_value值无法再次操作,它将投掷一个例外。
另一种发布方法表示资源的释放,并且参考计数将减少1。如果当前REFCNT等于1,并且1等于0,则表示尚未引用对象并可以回收。。DealLocate方法被调用以释放内存。
在Unfooledheapbytebuf中,内存的发布仅被安置到NULL,其余内存回收工作由JVM完成。
在UnfoodDirectByteBuf中,请致电PlatformDependent.freedirectbuffer发布直接内存。
Unfooledheapbytebuf是,但是相对于外部记忆的应用和释放,成本略低。
与Pomedheapbytebuf相比,您不需要自己管理内存池,在内存管理中不容易发生,并且更易于使用和维护。因此,在满意度的情况下,建议使用Undoledheapbytebuf。
首先查看Unfooledheapbytebuf的成员变量:
当我们提到AbstractBytebuf时,我们提到getBytes,容量和其他方法是由子类实施的。在这里,我们查看GetBytes的实现。可以从直接调用System.ArrayCopy数组的代码中看到它。
接下来,查看动态扩展能力方法,该方法主要执行以下操作:
从Bytebuf到ByteBuffer的转换,ByteBuffer的包裹方法主要使用::
Pomedbytebuf是Bytebuf。它应用了自己的内存池管理策略。通常,操作系统的内存管理策略与此相似,并且通常更容易。Pololarena的分布和释放主要由Poolarena实施。最终分配内存。
Poolarena是一个由多个PoolChunk组成的大块存储区域。
每个游泳池都由多个泳池书组成。
PoolSubpage负责管理页面内存,并且每个位图中的每个内存都标有每个内存的职业状态。
PooledDirectByteBuf基于内存池。非FooldirectByteBuf之间的唯一区别是缓冲区的分布和破坏策略不同。仅仅是buffer所需的内存池分布管理,bomedDirectbytebuf对象本身本身,但也使用循环。回收器。
回收器是一个轻量级的对象池。对象池的核心方法是分别从池到池的对象和回收对象,分别对应于其获取和回收方法。
PooledDirectbyTebuf中的复制方法用于复制新字节缓冲区的实例。该方法首先调用PomedByteBufallocator的DirectBuffer生成新的ByteBuf,然后复制数据。
DirectBuffer以Abstract AbstractByteBufalloCator实现。参数检查后,调用newDirectBuffer获取ByteBuf。该方法由子类实现。
在实现pooledbytebufallocator的内存池版本中,确定如果可用的内存池,将从它获得,否则单独是一个。
在非记忆池版本的UnfoodByteBufallocator中,它是直接的。
Netty学习和源代码分析GitHub地址
从进入到熟练视频教程(B)的Netty
Netty权威指南第2章第15章
原始:https://juejin.cn/post/7097052667054129165