主要是通过AbstractByteBufAllocator类实现的ByteBuffer的申请。

代码如下:

 @Override
public ByteBuf ioBuffer(int initialCapacity) {
if (PlatformDependent.hasUnsafe()) {
return directBuffer(initialCapacity);
}
return heapBuffer(initialCapacity);
} @Override
public ByteBuf ioBuffer(int initialCapacity, int maxCapacity) {
if (PlatformDependent.hasUnsafe()) {
return directBuffer(initialCapacity, maxCapacity);
}
return heapBuffer(initialCapacity, maxCapacity);
}

会根据是否有Unsafe的类支持来判断是否需要使用“堆外内存”;如果配置了3种情况则不会使用

(1)io.netty.noUnsafe这个属性false

(2)io.netty.tryUnsafe这个属性false

(3)org.jboss.netty.tryUnsafe这个属性false

我们暂且排除这3个配置,它会默认去尝试创建Unsafe类并且尝试ByteBuffer direct = ByteBuffer.allocateDirect(1);如果成功了就是用堆外内存的方式创建数据缓冲区。

内存缓冲区的创建是由netty本身去推测执行的。

核心类为:AdaptiveRecvByteBufAllocator

该类的初始化时使用一段静态代码块来包装ByteBuffer的申请内存大小的可能,代码如下:

static {
List<Integer> sizeTable = new ArrayList<Integer>();
for (int i = 16; i < 512; i += 16) {
sizeTable.add(i);//从16字节大小开始,每次增加16不超512
} for (int i = 512; i > 0; i <<= 1) {
sizeTable.add(i);//512以后每次扩容大小乘以2,直到溢出为止
} SIZE_TABLE = new int[sizeTable.size()];
for (int i = 0; i < SIZE_TABLE.length; i ++) {
SIZE_TABLE[i] = sizeTable.get(i);
}
}

创建的缓冲区从大小从16开始,最大到int溢出。

而且默认的开始分配为1024个字节,不小于64字节,不大于65536字节。

static final int DEFAULT_MINIMUM = 64;
static final int DEFAULT_INITIAL = 1024;
static final int DEFAULT_MAXIMUM = 65536;

最新文章

  1. Reactive Extensions(Rx) 学习
  2. 2016 最佳 Linux 发行版排行榜
  3. Android中Http加载如何得到Cookie和 WebView 加载网页如何得到的Cookie
  4. I2C 总线协议
  5. Keil AGDI Header File
  6. time_t和struct tm之间的转换
  7. Map集合的四种遍历
  8. Papers
  9. ToString格式.
  10. 【算法系列学习】[kuangbin带你飞]专题二 搜索进阶 D - Escape (BFS)
  11. (知识点)JS获取网页高度
  12. xargs命令详解
  13. java.lang.NoSuchMethodException: org.apache.catalina.deploy.WebXml addServlet
  14. 在Spring Boot框架下使用WebSocket实现消息推送
  15. SQL语句容易出现错误的地方-连载
  16. Django--用户认证组件auth(登录用-依赖session,其他用)
  17. jdk各种包安装方式
  18. 牛客多校第三场 A- PACM Team 背包/记忆路径
  19. 第5章 IP地址和子网划分(2)_IP地址分类和NAT技术
  20. PHP 使用 Memcached

热门文章

  1. vue cli 常见问题汇总
  2. CF1105D-Kilani and the Game-(多向bfs)
  3. OpenCV 学习笔记(7)vs2015+ffmpeg开发环境配置
  4. 数列分段II(信息学奥赛一本通 1436)(洛谷 1182)
  5. linux高性能服务器编程 (七) --Linux服务器程序规范
  6. 关于windows10用c++部署libtorch过程中遇到的一些问题
  7. 一周 GitHub 开源项目推荐:阿里、腾讯、陌陌、bilibili……
  8. T-MAX——团队展示
  9. 利用python实现汉字转拼音
  10. 基于Vue SEO的四种方案