网络|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中定义的几个成员变量,再从源码的角度来分析扩容。

网络|Netty的缓冲区容器ByteBuf的扩容机制_第1张图片

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

ByteBuf核心扩容方法

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

  1. 判断目标值与阈值threhold(4MB)的大小关系,等于直接返回阈值
    网络|Netty的缓冲区容器ByteBuf的扩容机制_第2张图片
  2. 采用步进4MB的方式完成扩容
    网络|Netty的缓冲区容器ByteBuf的扩容机制_第3张图片
  3. 采用64为基数,做倍增的方式完成扩容
    网络|Netty的缓冲区容器ByteBuf的扩容机制_第4张图片总结

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

参考资料

  • 《Netty权威指南》第二版 李林锋著

你可能感兴趣的:(网络,java,netty)