本文基于 Netty 4.1.56.Final 版本进行讨论韶光芿苒,岁月如梭,好久没有给大家更新 Netty 相干的文章了,在断更 Netty 的这段日子里,笔者一直在持续更新 Linux 内存管理相干的文章 ,如今为止,算是将 Linux 内存管理子系统相干的主干源码较为完整的给大家呈现了出来,同时也结识了很多喜好内核的读者,经常在背景留言讨论一些代码的设计细节,在这个过程中,我们相互分享,相互学习,浓浓的感受到了大家对技术那份纯粹的热爱,对于我自己来说,也是一种激励,学习,提高的机会。
注意,这里需要满足两次缩容条件才会进行缩容,且缩容步长为 1 (INDEX_DECREMENT),缩容比较谨慎。如果 totalBytesRead 大于等于当前 ByteBuf 容量—— nextReceiveBufferSize 时,说明 ByteBuf 的容量有点小了,需要进行扩容。扩容后的容量为 SIZE_TABLE[index + INDEX_INCREMENT],但不能超过 SIZE_TABLE[maxIndex](65535)。
满足一次扩容条件就进行扩容,而且扩容步长为 4 (INDEX_INCREMENT), 扩容比较奔放。
事实上,无论 Netty 中的 DirectByteBuf 有没有 Cleaner, Netty 都会选择手动的进行开释,目的就是为了避免 GC 的延迟 , 从而及时的开释 Direct Memory。那么 Netty 中的 DirectByteBuf 在什么情况下带有 Cleaner,又在什么情况下不带 Cleaner 呢 ?我们可以通过 PlatformDependent.useDirectBufferNoCleaner 方法的返回值进行判断:
欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) | Powered by Discuz! X3.4 |