AdaptiveRecvByteBufAllocator

本文介绍了一种通过记录之前Channel接收数据报文大小来自动调整ByteBuf对象初始容量的方法,该方法能有效避免因容量设置不当导致的频繁内存扩容或空间浪费问题,从而减少垃圾回收频率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

作用

  分配一个具有合理初始容量的ByetBuf对象,避免初始容量不合理(过小导致的频繁扩容,过大导致的空间浪费)导致的GC频率加快。
这里写图片描述

原理

原理:根据之前Channel接收到的数据报文大小进行计算,如果之前ByteBuf被填满,则扩展当前容量;如果连续2次接收到的数据报都小于指定值,则收缩当前的容量,以节约内存。下图为ByteBuf的容量随index的变化曲线,当实际占用的容量超过之前预分配的容量时,index增加,ByteBuf的容量变为index对应的值;缩容同理。
这里写图片描述

private void record(int actualReadBytes) {
            if (actualReadBytes <= SIZE_TABLE[Math.max(0, index - INDEX_DECREMENT - 1)]) {
                if (decreaseNow) {
                    index = Math.max(index - INDEX_DECREMENT, minIndex);
                    nextReceiveBufferSize = SIZE_TABLE[index];
                    decreaseNow = false;
                } else {
                    decreaseNow = true;
                }
            } else if (actualReadBytes >= nextReceiveBufferSize) {
                index = Math.min(index + INDEX_INCREMENT, maxIndex);
                nextReceiveBufferSize = SIZE_TABLE[index];
                decreaseNow = false;
            }
        }

使用

Bootstrap b = new Bootstrap();
            b.group(group)
             .channel(NioSocketChannel.class)
             .option(ChannelOption.TCP_NODELAY, true)
             .option(ChannelOption.RCVBUF_ALLOCATOR, AdaptiveRecvByteBufAllocator.DEFAULT)

参考:

  1. https://www.jianshu.com/p/e12c7f3861e1
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值