Netty分布式ByteBuf使用的回收逻辑是什么


这篇文章主要介绍“Netty分布式ByteBuf使用的回收逻辑是什么”,在日常操作中,相信很多人在Netty分布式ByteBuf使用的回收逻辑是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Netty分布式ByteBuf使用的回收逻辑是什么”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!之前的章节我们提到过, 堆外内存是不受jvm垃圾回收机制控制的, 所以我们分配一块堆外内存进行ByteBuf操作时, 使用完毕要对对象进行回收, 这一小节, 就以PooledUnsafeDirectByteBuf为例讲解有关内存分配的相关逻辑PooledUnsafeDirectByteBuf中内存释放的入口方法是其父类AbstractReferenceCountedByteBuf中的release方法:if(refCnt == decrement)中判断当前byteBuf是否没有被引用了, 如果没有被引用, 则通过deallocate()方法进行释放因为我们是以PooledUnsafeDirectByteBuf为例, 所以这里会调用其父类PooledByteBuf的deallocate方法:this.handle = -1表示当前的ByteBuf不再指向任何一块内存memory = null这里将memory也设置为nullchunk.arena.free(chunk, handle, maxLength, cache)这一步是将ByteBuf的内存进行释放recycle()是将对象放入的对象回收站, 循环利用首先判断是不是unpooled, 我们这里是Pooled, 免费云主机域名所以会走到else块中:sizeClass(normCapacity)计算是哪种级别的size, 我们按照tiny级别进行分析cache.add(this, chunk, handle, normCapacity, sizeClass)是将当前当前ByteBuf进行缓存我们之前讲过, 再分配ByteBuf时首先在缓存上分配, 而这步, 就是将其缓存的过程, 跟进去:首先根据根据类型拿到相关类型缓存节点, 这里会根据不同的内存规格去找不同的对象, 我们简单回顾一下, 每个缓存对象都包含一个queue, queue中每个节点是entry, 每一个entry中包含一个chunk和handle, 可以指向唯一的连续的内存假设我们是tiny类型, 这里就会走到cacheForTiny(area, normCapacity)方法中, 跟进去:这个方法我们之前剖析过, 就是根据大小找到第几个缓存中的第几个缓存, 拿到下标之后, 通过cache去超相对应的缓存对象:我们这里看到, 是直接通过下标拿的缓存对象这里的cache对象调用了一个add方法, 这个方法就是将chunk和handle封装成一个entry加到queue里面我们跟到add方法中:我们之前介绍过, 从在缓存中分配的时候从queue弹出一个entry, 会放到一个对象池里面, 而这里Entry entry = newEntry(chunk, handle)就是从对象池里去取一个entry对象, 然后将chunk和handle进行赋值然后通过queue.offer(entry)加到queue中这里加到缓存之后, 如果成功, 就会return, 如果不成功, 就会调用freeChunk(chunk, handle, sizeClass)方法, 这个方法的意义是, 将原先给ByteBuf分配的内存区段标记为未使用跟进freeChunk简单分析下:我们再跟到free方法中:chunk.free(handle)的意思是通过chunk释放一段连续的内存再跟到free方法中:if(bitmapIdx != 0)这里判断是当前缓冲区分配的级别是Page还是Subpage, 如果是Subpage, 则会找到相关的Subpage将其位图标记为0如果不是subpage, 这里通过分配内存的反向标记, 将该内存标记为未使用这段逻辑可以读者自行分析, 如果之前分配相关的知识掌握扎实的话, 这里的逻辑也不是很难回到PooledByteBuf的deallocate方法中:到此,关于“Netty分布式ByteBuf使用的回收逻辑是什么”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注百云主机网站,小编会继续努力为大家带来更多实用的文章!

相关推荐: PHP中怎么将数值转换为两位小数

本文小编为大家详细介绍“PHP中怎么将数值转换为两位小数”,内容详细,步骤清晰,细节处理妥当,希望这篇“PHP中怎么将数值转换为两位小数”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。 首先,我们需要了解PHP中数值的基本类型。PHP…

免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。

(0)
打赏 微信扫一扫 微信扫一扫
上一篇 07/24 11:33
下一篇 07/24 11:33

相关推荐