Netty的Recycler为何不恢复栈内所有对象?WeakOrderQueue作用是什么
Netty Recycler相关问题解答
WeakOrderQueue的设计目的
Recycler本身是基于线程本地栈Stack实现的对象池,核心目标是降低小对象频繁创建销毁带来的GC开销,WeakOrderQueue的设计完全是为了解决跨线程回收的痛点:
- 规避跨线程操作的锁冲突:如果没有WeakOrderQueue,其他线程回收不属于自己的对象时,必须直接加锁修改目标线程的
Stack,高并发场景下锁竞争会非常严重,吞吐量会大幅下降。引入WeakOrderQueue后,其他线程回收对象时,只会写入自己线程绑定到目标Stack的WeakOrderQueue,写入过程是无锁的,只有Stack所属的线程才会在后续批量拉取WeakOrderQueue里的对象到自己的栈中,极大降低了锁开销。 - 避免内存泄漏:WeakOrderQueue对绑定的
Stack持有的是弱引用,一旦Stack所属的线程被销毁,Stack被GC回收后,对应的WeakOrderQueue也可以被自动回收,不会出现内存常驻的问题。 - 保证对象可复用:所有跨线程回收的对象最终都会被
Stack所属线程拉回栈中,不会出现对象散落在其他线程无法被复用的情况。
Recycler不会恢复栈中全部对象的原因
这个设计本质上是性能和内存占用之间的权衡:
- 控制内存占用上限:如果每次都恢复全部对象,对象池的大小会随着流量峰值无限制膨胀,流量回落到低谷时,大量闲置对象会长期占用内存无法释放,造成不必要的内存浪费。
- 降低GC压力:超出预设容量的对象会被直接丢弃交给GC回收,避免对象池持有大量长期存活的老年代对象,减少Full GC的执行时间和频率。
- 控制操作开销:栈的操作成本会随着栈中对象数量的增长而升高,限制可恢复的对象数量,能保证对象池的读写操作始终维持在较低的耗时水平。
内容的提问来源于stack exchange,提问作者zlzfly
相关产品推荐
相关产品推荐

