【Netty源码解读和权威指南】第59篇:RecvByteBufAllocator源码解析——动态调整接收缓冲区

发布时间:2026/6/25 22:28:55
【Netty源码解读和权威指南】第59篇:RecvByteBufAllocator源码解析——动态调整接收缓冲区 上一篇【第58篇】PoolSubpage源码解析——小内存分配的精妙设计下一篇【第60篇】Netty并发编程实践——多线程安全的正确姿势一、自适应算法Netty根据上次读取的字节数动态调整下次缓冲区大小publicclassAdaptiveRecvByteBufAllocator{staticfinalintDEFAULT_MINIMUM64;// 最小64BstaticfinalintDEFAULT_INITIAL1024;// 初始1KBstaticfinalintDEFAULT_MAXIMUM65536;// 最大64KBstaticfinalint[]SIZE_TABLE{16,32,48,64,80,96,112,128,144,160,176,192,208,224,240,256,...65536};}二、调整策略publicvoidrecord(intactualReadBytes){// 如果读取量 ≤ 前一级SIZE_TABLE → 减少缓冲区if(actualReadBytesSIZE_TABLE[max(0,index-1)]){if(decreaseNow)indexmax(index-1,minIndex);decreaseNowfalse;}// 如果读取量 ≥ 当前缓冲区 → 增大缓冲区4级elseif(actualReadBytesnextReceiveBufferSize){indexmin(index4,maxIndex);decreaseNowfalse;}}// 连续2次读取量小于当前缓冲区 → 减少publicvoidreadComplete(){decreaseNowtrue;}示例当前缓冲区1024index6 第1次读取: 800字节 → 1024, 触发decreaseNowtrue 第2次读取: 500字节 → ≤前一级(512), decreaseNowtrue → 减小到512 第3次读取: 1200字节 → 1024 → 增大到2048(4级)三、Fixed vs Adaptive// 固定始终分配4096B.childOption(ChannelOption.RCVBUF_ALLOCATOR,newFixedRecvByteBufAllocator(4096));// 自适应64B → 64KB动态调整推荐.childOption(ChannelOption.RCVBUF_ALLOCATOR,newAdaptiveRecvByteBufAllocator(64,1024,65536));四、实战配置// 针对小消息场景newAdaptiveRecvByteBufAllocator(32,512,4096);// 针对大文件传输newAdaptiveRecvByteBufAllocator(512,8192,131072);五、总结特性说明初始值1024 B增大策略连续读满 4级减小策略连续2次读不满 -1级SIZE_TABLE预定义的阶梯大小上一篇【第58篇】PoolSubpage源码解析——小内存分配的精妙设计下一篇【第60篇】Netty并发编程实践——多线程安全的正确姿势