Netty之轻量级对象池Recycler
为什么说Recycler是“轻量级”的对象池?
功能简单:对象池只提供了创建和回收的基本接口,没有复杂的诸如有效性检测、空闲回收和拒绝策略等一些复杂功能。
逻辑简单:实现逻辑清晰简单,没有复杂的算法逻辑。
Recycler核心方法
- get(): 获取一个对象;
- recycle(T, Handle): 回收一个对象,T为对象泛型;
- newObject(Handle): 当没有可用对象时创建对象的实现方法;
Recycler核心类
- DefaultHandle: 对象的包装类,在Recycler中缓存的对象都会包装成DefaultHandle类。
- Stack: 存储本线程回收的对象 。对象的获取和回收对应Stack的pop和push,即获取对象时从Stack中pop出1个DefaultHandle,回收对象时将对象包装成DefaultHandle push到Stack中。Stack会与线程绑定,即每个用到Recycler的线程都会拥有1个Stack,在该线程中获取对象都是在该线程的Stack中pop出一个可用对象。
- WeakOrderQueue: 存储其它线程回收到本线程stack的对象 ,当某个线程从Stack中获取不到对象时会从WeakOrderQueue中获取对象。每个线程的Stack拥有1个WeakOrderQueue链表,链表每个节点对应1个其它线程的WeakOrderQueue,其它线程回收到该Stack的对象就存储在这个WeakOrderQueue里。
- Link: WeakOrderQueue中包含1个Link链表,回收对象存储在链表某个Link节点里,当Link节点存储的回收对象满了时会新建1个Link放在Link链表尾。
Recycler创建和回收流程
Recycler存储结构