Netty池化内存理解:Recycler

本文深入探讨了Netty中的Recycler机制,详细解释了PooledDirectByteBuf.newInstance()方法的工作流程,如何实现对象复用以减少内存分配和垃圾回收的开销。文章还分析了Recycler中的Stack和WeakOrderQueue,阐述了它们在多线程环境下防止对象重复回收的作用,并展示了ByteBuf的回收和重利用过程。
摘要由CSDN通过智能技术生成

我们上几篇文章分析了池化内存的使用:PoolChunk和PoolSubPage
我们通过代码看到了池化内存后将一些信息都记录到了ByteBuf的实现类上。在allocat()方法之前都会调用newByteBuf()返回一个实例,那个在这个过程干了什么呢,我们需要也了解下。
整个Recycler进行对象缓存使用,减少对象多次创建和GC回收性能消耗。

1.PooledDirectByteBuf.newInstance(maxCapacity)

我们还是以PooledDirectByteBuf为例:

static PooledDirectByteBuf newInstance(int maxCapacity) {
   
    PooledDirectByteBuf buf = RECYCLER.get();
     buf.reuse(maxCapacity);
     return buf;
 }

这个实现有点似曾相识的感觉,在PooledByteBufAllocator中newHeapBuffer()也有类似的处理:

PoolThreadCache cache = threadCache.get();

那么看下这个RECYCLER的实现处理:

final class PooledDirectByteBuf extends PooledByteBuf<ByteBuffer> {
   
	private static final Recycler<PooledDirectByteBuf> RECYCLER = new Recycler<PooledDirectByteBuf>() {
   
        @Override
        protected PooledDirectByteBuf newObject(Handle<PooledDirectByteBuf> handle) {
   
            return new PooledDirectByteBuf(handle, 0);
        }
    };
}

一个简单的Recycler子类,我们稍后留意下这个**newObject()**方法是怎么用的,我们转到get()方法中:

public final T get() {
   
        if (maxCapacityPerThread == 0) {
   
            return newObject((Handle<T>) NOOP_HANDLE);
        }
        Stack<T> stack = threadLocal.get();
        DefaultHandle<T> handle = stack.pop();
        if (handle == null) {
                                                                                                                                                                                   
            handle = stack.newHandle();
            handle.value = newObject(handle);
        }
        return (T) handle.value;
    }

我们看到了熟悉的threadLocal,可以看到Recycler中的threadLocal中存储的属性是:Stack。

  • Recycler中的threadLocal
private final FastThreadLocal<Stack<T>> threadLocal = new FastThreadLocal<Stack<T>>() {
   
        @Override
        protected Stack<T> initialValue
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值