recycler文件夹可以删除吗 recycler

本系列Netty源码解析文章基于 4.1.56.Final版本
最近在 Review Netty 代码的时候,不小心用我的肉眼抓到了一个隐藏很深很深的内存泄露 Bug 。

recycler文件夹可以删除吗 recycler

文章插图
recycler文件夹可以删除吗 recycler

文章插图
recycler文件夹可以删除吗 recycler

文章插图
recycler文件夹可以删除吗 recycler

文章插图
recycler文件夹可以删除吗 recycler

文章插图
recycler文件夹可以删除吗 recycler

文章插图
recycler文件夹可以删除吗 recycler

文章插图
recycler文件夹可以删除吗 recycler

文章插图
recycler文件夹可以删除吗 recycler

文章插图
recycler文件夹可以删除吗 recycler

文章插图
recycler文件夹可以删除吗 recycler

文章插图
recycler文件夹可以删除吗 recycler

文章插图
recycler文件夹可以删除吗 recycler

文章插图
recycler文件夹可以删除吗 recycler

文章插图
recycler文件夹可以删除吗 recycler

文章插图
recycler文件夹可以删除吗 recycler

文章插图
recycler文件夹可以删除吗 recycler

文章插图
recycler文件夹可以删除吗 recycler

文章插图
recycler文件夹可以删除吗 recycler

文章插图
recycler文件夹可以删除吗 recycler

文章插图
recycler文件夹可以删除吗 recycler

文章插图
recycler文件夹可以删除吗 recycler

文章插图
recycler文件夹可以删除吗 recycler

文章插图
recycler文件夹可以删除吗 recycler

文章插图
recycler文件夹可以删除吗 recycler

文章插图
recycler文件夹可以删除吗 recycler

文章插图
recycler文件夹可以删除吗 recycler

文章插图
recycler文件夹可以删除吗 recycler

文章插图
recycler文件夹可以删除吗 recycler

文章插图
recycler文件夹可以删除吗 recycler

文章插图
recycler文件夹可以删除吗 recycler

文章插图
recycler文件夹可以删除吗 recycler

文章插图
recycler文件夹可以删除吗 recycler

文章插图
recycler文件夹可以删除吗 recycler

文章插图
recycler文件夹可以删除吗 recycler

文章插图
Stack链表的插入.png
11.7 向WeakOrderQueue节点中添加回收对象终于的终于我们到了多线程回收对象的最后一步了,本篇文章到这里也接近尾声了,大家在坚持一下 。
【recycler文件夹可以删除吗 recycler】这里要做的事情就是,将回收对象添加到回收线程对应的WeakOrderQueue节点中,Netty会在Link链表的尾结点处添加回收对象,如果尾结点容量已满,就继续新创建一个Link 。将回收对象添加到新的Link节点中 。
void add(DefaultHandle<?> handle) {//将handler中的lastRecycledId标记为当前weakOrderQueue中的Id,一个stack和一个回收线程对应一个weakOrderQueue节点//表示该池化对象 最近的一次是被当前回收线程回收的 。handle.lastRecycledId = id;// 控制异线程回收频率 只回收1/8的对象// 这里需要关注的细节是其实在scavengeSome方法中将weakOrderQueue中的待回收对象转移到创建线程的stack中时,Netty也会做回收频率的限制// 这里在回收线程回收的时候也会控制回收频率(总体控制两次)netty认为越早的做回收频率控制越好 这样可以避免weakOrderQueue中的容量迅速的增长从而失去控制if (handleRecycleCount < interval) {handleRecycleCount++;// Drop the item to prevent recycling to aggressive.return;}handleRecycleCount = 0;//从尾部link节点开始添加新的回收对象Link tail = this.tail;int writeIndex;//如果当前尾部link节点容量已满,就需要创建新的link节点if ((writeIndex = tail.get()) == LINK_CAPACITY) {//创建新的Link节点Link link = head.newLink();//如果availableSharedCapacity的容量不够了,则无法创建Link 。丢弃待回收对象if (link == null) {// 丢弃对象return;}// We allocate a Link so reserve the space//更新尾结点this.tail = tail = tail.next = link;writeIndex = tail.get();}//将回收对象handler放入尾部link节点中tail.elements