网络|Netty的缓冲区容器ByteBuf的扩容机制

ByteBu简介

       ByteBuf是我们使用netty中不可避免会用到的数据容器,在某种程度上,和我们java中的集合有很多相似之处,只不过集合用于盛装的数据是对象数据,但ByteBuf更多盛装的是byte,是一种缓存区的概念,但某种意义上来说他又是容器,既然是容器会不会和集合有相似之处呢,比如扩容?(以下源码分析版本:4.1.35.Final)

        <dependency>
            <groupId>io.netty</groupId>
            <artifactId>netty-all</artifactId>
            <version>4.1.35.Final</version>
        </dependency>

Bytebuf的成员变量

       如果我们需要了解ByteBuf的扩容,我们需要先了解ByteBuf中定义的几个成员变量,再从源码的角度来分析扩容。

在这里插入图片描述

  • minNewCapacity表用户传入需要扩容的值大小
  • threhold英译为阈值,就如字面的意思,Bytebuf内部设定容量的最大值
  • maxCapacity表Netty最大能接受的容量大小,一般为int的最大值

ByteBuf核心扩容方法

       进入ByteBuf源码中,深入分析其扩容方法: idea源码进入:ByteBuf.writeByte()->AbstractByteBuf->calculateNewCapacity

  1. 判断目标值与阈值threhold(4MB)的大小关系,等于直接返回阈值
    在这里插入图片描述
  2. 采用步进4MB的方式完成扩容
    在这里插入图片描述
  3. 采用64为基数,做倍增的方式完成扩容
    在这里插入图片描述总结

       Netty的ByteBuf需要动态扩容来满足需要,扩容过程: 默认门限阈值为4MB(这个阈值是一个经验值,不同场景,可能取值不同),当需要的容量等于门限阈值,使用阈值作为新的缓存区容量 目标容量,如果大于阈值,采用每次步进4MB的方式进行内存扩张((需要扩容值/4MB)*4MB),扩张后需要和最大内存(maxCapacity)进行比较,大于maxCapacity的话就用maxCapacity,否则使用扩容值 目标容量,如果小于阈值,采用倍增的方式,以64(字节)作为基本数值,每次翻倍增长64-》128-》256,直到倍增后的结果大于或等于需要的容量值。

参考资料

  • 《Netty权威指南》第二版 李林锋著
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值