Recycler
属性
属性 值 含义 static final Handle NOOP_HANDLEnew Handle() { @Override public void recycle(Object object) { // NOOP } }
static final AtomicInteger ID_GENERATORnew AtomicInteger(Integer.MIN_VALUE)ID生成器
static final int OWN_THREAD_IDID_GENERATOR.getAndIncrement()自己的线程ID
static final int DEFAULT_INITIAL_MAX_CAPACITY_PER_THREAD4 * 1024 每个线程默认的最大初始容量
static final int DEFAULT_MAX_CAPACITY_PER_THREAD4 * 1024 每个线程默认的最大容量
static final int INITIAL_CAPACITY256 初始容量 static final int MAX_SHARED_CAPACITY_FACTOR2 最大共享容量因子 static final int MAX_DELAYED_QUEUES_PER_THREADNettyRuntime.availableProcessors() * 2每个线程的最大延迟队列数量
static final int LINK_CAPACITY16 LINK的容量
static final int RATIO8
final int maxCapacityPerThread4 * 1024 每个线程的最大容量
final int maxSharedCapacityFactor2 最大共享容量因子
final int interval8 默认等于RATIO
final int maxDelayedQueuesPerThreadNettyRuntime.availableProcessors() * 2 每个线程的最大延迟队列数量
final FastThreadLocal<Stack<T>> threadLocalnew FastThreadLocal<Stack<T>>() {
@Override
protected Stack<T> initialValue() {
return new Stack<T>(Recycler.this, Thread.currentThread(), maxCapacityPerThread, maxSharedCapacityFactor,
interval, maxDelayedQueuesPerThread);
}@Override
protected void onRemoval(Stack<T> value) {
// Let us remove the WeakOrderQueue from the WeakHashMap directly if its safe to remove some overhead
if (value.threadRef.get() == Thread.currentThread()) {
if (DELAYED_RECYCLED.isSet()) {
DELAYED_RECYCLED.get().remove(value);
}
}
}
};
static final FastThreadLocal<Map<Stack<?>, WeakOrderQueue>> DELAYED_RECYCLEDnew FastThreadLocal<Map<Stack<?>, WeakOrderQueue>>() { @Override protected Map<Stack<?>, WeakOrderQueue> initialValue() { return new WeakHashMap<Stack<?>, WeakOrderQueue>(); } }
构造方法
protected Recycler() { this(DEFAULT_MAX_CAPACITY_PER_THREAD); } protected Recycler(int maxCapacityPerThread) { this(maxCapacityPerThread, MAX_SHARED_CAPACITY_FACTOR); } protected Recycler(int maxCapacityPerThread, int maxSharedCapacityFactor) { this(maxCapacityPerThread, maxSharedCapacityFactor, RATIO, MAX_DELAYED_QUEUES_PER_THREAD); } protected Recycler(int maxCapacityPerThread, int maxSharedCapacityFactor, int ratio, int maxDelayedQueuesPerThread) { interval = safeFindNextPositivePowerOfTwo(ratio); if (maxCapacityPerThread <= 0) { this.maxCapacityPerThread = 0; this.maxSharedCapacityFactor = 1; this.maxDelayedQueuesPerThread = 0; } else { this.maxCapacityPerThread = maxCapacityPerThread; this.maxSharedCapacityFactor = max(1, maxSharedCapacityFactor); this.maxDelayedQueuesPerThread = max(0, maxDelayedQueuesPerThread); } }
DefaultHandle<T>
private static final class DefaultHandle<T> implements Handle<T> { int lastRecycledId; int recycleId; boolean hasBeenRecycled; Stack<?> stack; Object value; DefaultHandle(Stack<?> stack) { this.stack = stack; } }
Link
static final class Link extends AtomicInteger { final DefaultHandle<?>[] elements = new DefaultHandle[LINK_CAPACITY]; int readIndex; Link next; }
Head
private static final class Head { private final AtomicInteger availableSharedCapacity; Link link; Head(AtomicInteger availableSharedCapacity) { this.availableSharedCapacity = availableSharedCapacity; } }
WeakOrderQueue extends WeakReference<Thread>
属性
static final WeakOrderQueue DUMMY = new WeakOrderQueue(); private final Head head; private Link tail; // pointer to another queue of delayed items for the same stack private WeakOrderQueue next; private final int id = ID_GENERATOR.getAndIncrement(); private final int interval; private int handleRecycleCount;构造方法
private WeakOrderQueue() { super(null); head = new Head(null); interval = 0; } private WeakOrderQueue(Stack<?> stack, Thread thread) { super(thread); tail = new Link(); // 重要的是我们不要将堆栈本身存储在WeakOrderQueue中,因为堆栈也在 WeakHashMap中用作键。因此,只需存储包含的AtomicInteger即可使堆栈本身处于GC状态。 head = new Head(stack.availableSharedCapacity); head.link = tail; interval = stack.interval; handleRecycleCount = interval; // 从interval开始,因此第一个将被回收。 } static WeakOrderQueue newQueue(Stack<?> stack, Thread thread) { // 我们分配了一个链接,所以保留了空间 if (!Head.reserveSpaceForLink(stack.availableSharedCapacity)) { return null; } final WeakOrderQueue queue = new WeakOrderQueue(stack, thread); // 在构造函数外部执行以确保WeakOrderQueue.this不会逸出构造函数,因此//仍可在构造函数时对其进行访问。 stack.setHead(queue); return queue; } static boolean reserveSpaceForLink(AtomicInteger availableSharedCapacity) { for (;;) { int available = availableSharedCapacity.get(); //LINK_CAPACITY=16 if (available < LINK_CAPACITY) { return false; } if (availableSharedCapacity.compareAndSet(available, available - LINK_CAPACITY)) { return true; } } }
Stack<T>
属性
final Recycler<T> parent; final WeakReference<Thread> threadRef; // 2 * 1024 final AtomicInteger availableSharedCapacity; // CPU * 2 private final int maxDelayedQueues; // 4*1024 private final int maxCapacity; // 初始值为8 当handleRecycleCount<interval的时候,对象会被直接丢弃 private final int interval; // 256 DefaultHandle<?>[] elements; int size; //初始值为8 每回收一个对象handleRecycleCount被重置为0 每丢弃一个对象handleRecycleCount加1 private int handleRecycleCount; private WeakOrderQueue cursor, prev; private volatile WeakOrderQueue head;构造方法
Stack(Recycler<T> parent, Thread thread, int maxCapacity, int maxSharedCapacityFactor, int interval, int maxDelayedQueues) { this.parent = parent; threadRef = new WeakReference<Thread>(thread); //4 * 1024 this.maxCapacity = maxCapacity; //LINK_CAPACITY=16 maxSharedCapacityFactor=2, so availableSharedCapacity = 2 * 1024 availableSharedCapacity = new AtomicInteger(max(maxCapacity / maxSharedCapacityFactor, LINK_CAPACITY)); //INITIAL_CAPACITY = 256,so elements的长度为256 elements = new DefaultHandle[min(INITIAL_CAPACITY, maxCapacity)]; // interval = 8 this.interval = interval; // handleRecycleCount = 8 handleRecycleCount = interval; // Start at interval so the first one will be recycled. // maxDelayedQueues = CPU*2 this.maxDelayedQueues = maxDelayedQueues; }
343

被折叠的 条评论
为什么被折叠?



