深入netty13-Recycler对象池
发布时间
阅读量:
阅读量
对象池的作用
- 优化效果:该方案通过复用对象降低了对象创建及销毁的成本。
- GC友好:适合垃圾回收机制的应用场景,并且减少了对象的创建及销毁过程。
Recycler 的内部结构
Stack 作为一种顶层对象池的数据结构,在多线程环境下被设计用于存储当前线程回收的对象 pool。每个线程都通过 FastThreadLocal 独立地持有自己的对象池实例,从而有效地避免了资源竞争问题。
该类 WeakOrderQueue 用于存储其他线程因回收至当前线程而被分配的对象,并在适当的时候被 Stack 释放
Link 表示位于每个 WeakOrderQueue 内的链表,并用于存储回收的对象。每个 Link 结点默认存储一定数量的对象。
Link 表示位于每个 WeakOrderQueue 内的链表,并用于存储回收的对象。每个 Link 结点默认存储一定数量的对象。
DefaultHandle 用于管理被回收的实际对象实例。在 Stack 和 WeakOrderQueue 中都能找到对实际对象实例进行存储的方式。
Recycler 的设计理念
- 私有化机制:通过实现线性作用域的方式,在内存中为每个线程分配独立的对象池资源块(即
FastThreadLocal),从而减少多线程之间的同步开销。- 对象回收比例配置:通过设置对象回收比例配置参数(即
ratioMask)来实现灵活的对象生命周期管理策略。 - 跨线程弱引用机制:采用弱引用机制管理跨线程对象的回收过程,在适当的时候自动释放被其他线程持有但不再活跃的对象引用。
- 动态数组存储:基于动态数组存储多个DefaultHandle实例,并根据实际需求动态扩展内存空间以满足不同数量的对象存储需求。
- 对象回收比例配置:通过设置对象回收比例配置参数(即
从Recycler中获取对象
使用 FastThreadLocal 提取当前线程的唯一栈缓存 Stack;
尝试从 Stack 中执行弹出 DefaultHandle 的操作;
当 Stack 为空时,则生成一个新的对象并与其绑定 DefaultHandle。
Stack的工作原理
- 移除栈顶元素:当Stack元素队列不为空时(即
Stack.elements != null && !Stack.elements.isEmpty()),会立即删除栈顶位置。- 回收未被使用的对象:通过调用scavenge方法将其他线程未被使用的对象转移至当前元素队列中。
scavenge方法
- 从WeakOrderQueue转移对象:尝试将目标对象实例安排至
Stack``elements数组中。- 处理退出线程的情况:当处理退出的线程时(即该线程已退出),其对应的对象实例将被回收,并从原有的`WeakOrderQueue``元素列表中移除。
对象回收
对象回收的控制
- 回收频率的管理:通过
dropHandle方法实现资源回收频率的调节,在每8个对象周期内执行一次资源释放。 - 堆栈容量的扩展:当现有对象数量与被回收对象之和超过当前容量但未达到最大容量时,则会触发堆栈容量的扩展。
对象回收原理
- 本线程回收:将数据放入Stack的elements数组中,在达到最大容量时放弃。
- 跨线程缓存机制:利用WeakOrderQueue进行交互,并基于DELAYED_RECYCLED缓冲区来支撑实现体的回收。
异线程对象回收
- 获取 WeakOrderQueue:通过 DELAYED_RECYCLED 获取或创建 WeakOrderQueue。
- 插入目标至队列:在队列中的 Link 链表中插入目标,在超出阈值时移除目标。
Netty中的Recycler应用实例
- SharedHeapMemory 和 DirectMemory :这两种缓冲区分别对应于堆内存与直接内存的共享机制实现。通过同一个对象池(object cache),Netty系统能够有效地复用预先分配好的对象实例(object instance),从而减少了频繁创建与销毁对象所带来的资源消耗。
- MemoryRegionCache 是一种负责维护一个队列列表的数据结构。在这个队列中存储着多个Entry节点(entry node),每个Entry节点都负责存储一组内存块(memory block)。这些Entry节点同样也是通过同一个对象池来进行资源管理与复用。
总结
Recycler核心组件
- Stack 作为私有缓存用于存储供多个线程复用的值。
- WeakOrderQueue 管理各线程之间对象的回收与共享 通过链表实现对象间的动态交互。
Recycler对象获取流程
- 主要来源是Stack:在需要一个对象的时候,在堆栈内存中有该对象之前就已经存在。
- 来自WeakOrderQueue的迁移:当堆栈内存中没有该对象时,在堆栈内存有空闲空间的情况下,默认情况下会有优先级较高的请求者会被回收器移至堆栈内存。
如果堆栈内存为空,则回收器会在弱有序队列中寻找目标请求者并将其移动至堆栈内存后再进行回收
- 来自WeakOrderQueue的迁移:当堆栈内存中没有该对象时,在堆栈内存有空闲空间的情况下,默认情况下会有优先级较高的请求者会被回收器移至堆栈内存。
Recycler对象回收策略
- 同线程回收:当一个对象不再被使用时,在同一创建过程中(即在同一时间点),Recycler会将其直接放置回Stack以供后续重用。
- 异线程回收:若同一对象被分配到不同的线程空间中(即跨进程或跨线程),Recycler会将其存储在WeakOrderQueue的队列上,并等待相关其他线程完成回收工作以完成整个过程。
Recycler控制回收频率
- 回收速率控制 :为了避免过度回收带来的性能问题 Recycler 采用了一种算法来调节回收频率 从而确保在每 8 个对象中仅有一个会被回收
全部评论 (0)
还没有任何评论哟~
