Netty源码分析(七)—Recycler对象池分析
Netty中实现轻量级的对象池技术,用来减少因为频繁的对象创建销毁而触发的内存分配和GC带来的性能消耗;Recycler是netty轻量级对象池的具体实现;
Netty使用ThreadLocal变量实现对象池的线程隔离进而实现对象池的无锁线程安全,相当于每个线程都维护着各自的小线程池
个人主页:tuzhenyu’s page
原文地址:Netty源码分析(七)—Recycler对象池分析
(0) Recycler使用实例
public class RecyclerTest {
static class WrapRecycler{
private boolean tmp ;
private final static Recycler<WrapRecycler> RECYCLER = new Recycler<WrapRecycler>() {
@Override
protected WrapRecycler newObject(Handle<WrapRecycler> handle) {
return new WrapRecycler(handle);
}
};
Recycler.Handle<WrapRecycler> handle;
WrapRecycler(Recycler.Handle<WrapRecycler> handle){
this.handle = handle;
this.tmp = false;
}
static WrapRecycler getInstance(){
return RECYCLER.get();
}
void recycle(){
this.tmp = false;
handle.recycle(this);
}
public boolean getTmp(){
return tmp;
}
public void setTmp(boolean tmp){
this.tmp = tmp;
}
}
public static void main(String[] args) {
WrapRecycler instance = WrapRecycler.getInstance();
System.out.println(instance.hashCode());
System.out.println(instance.getTmp());
instance.setTmp(true);
System.out.println(instance.getTmp());
instance.recycle();
instance = WrapRecycler.getInstance();
System.out.println(instance.hashCode());
System.out.println(instance.getTmp());
}
}
- 运行结果,两次获取的对象的hashcode哈希值相同说明是同一个对象
41359092
false
true
41359092
false
(1) Recycler类结构
Recycler是一个抽象类,在目标类中创建Recycler对象池实例时需要实现newObject(Handler handler)方法用来创建特定类的实例;
Recycler对象池内部是用一个对象数组维护对象池中的对象实例,对外提供统一的对象创建和回收接口:
Recycler#get方法 : 是获取对象池中对象的入口, 如果有可用对象,直接返回, 没有就调用newObject()方法创建一个.
Recycler#recycle方法: 是对象使用完毕后回收对象,只能回收当前线程创建的对象 现在已经标记@Deprecated不建议使用了, 建议使用Recycler.Handle#recycler方法,可以回收不是当前线程创建的对象, 复用性和性能更好了.
Recycler对象池的实现主要是通过三个核心组件:Handler,WeakOrderQueue和Stack
1. Handler组件
- Handler组件主要用来对外提供一个recycle()对象回收接口
static <