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

代码如下:

  1. @Override
  2. public ByteBuf ioBuffer(int initialCapacity) {
  3. if (PlatformDependent.hasUnsafe()) {
  4. return directBuffer(initialCapacity);
  5. }
  6. return heapBuffer(initialCapacity);
  7. }
  8.  
  9. @Override
  10. public ByteBuf ioBuffer(int initialCapacity, int maxCapacity) {
  11. if (PlatformDependent.hasUnsafe()) {
  12. return directBuffer(initialCapacity, maxCapacity);
  13. }
  14. return heapBuffer(initialCapacity, maxCapacity);
  15. }

会根据是否有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的申请内存大小的可能,代码如下:

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

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

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

  1. static final int DEFAULT_MINIMUM = 64;
  2. static final int DEFAULT_INITIAL = 1024;
  3. static final int DEFAULT_MAXIMUM = 65536;

netty内存数据缓冲区使用策略的更多相关文章

  1. Netty 内存回收之 noCleaner 策略

    前言 对于堆外内存,使用 System.gc() 是不靠谱的,依赖老年代 FGC 也是不靠谱的,而且大部分调优指南都设置了 -DisableExplicitGC 禁用 System.gc().所以主动 ...

  2. 感悟优化——Netty对JDK缓冲区的内存池零拷贝改造

    NIO中缓冲区是数据传输的基础,JDK通过ByteBuffer实现,Netty框架中并未采用JDK原生的ByteBuffer,而是构造了ByteBuf. ByteBuf对ByteBuffer做了大量的 ...

  3. Linux就这个范儿 第15章 七种武器 linux 同步IO: sync、fsync与fdatasync Linux中的内存大页面huge page/large page David Cutler Linux读写内存数据的三种方式

    Linux就这个范儿 第15章 七种武器  linux 同步IO: sync.fsync与fdatasync   Linux中的内存大页面huge page/large page  David Cut ...

  4. Netty内存池及命中缓存的分配

    内存池的内存规格: 在前面的源码分析过程中,关于内存规格大小我们应该还有些印象.其实在Netty 内存池中主要设置了四种规格大小的内存:tiny 是指0-512Byte 之间的规格大小,small 是 ...

  5. 一文搞懂 Netty 发送数据全流程 | 你想知道的细节全在这里

    欢迎关注公众号:bin的技术小屋,如果大家在看文章的时候发现图片加载不了,可以到公众号查看原文 本系列Netty源码解析文章基于 4.1.56.Final版本 在<Netty如何高效接收网络数据 ...

  6. Linux就这个范儿 第18章 这里也是鼓乐笙箫 Linux读写内存数据的三种方式

    Linux就这个范儿 第18章  这里也是鼓乐笙箫  Linux读写内存数据的三种方式 P703 Linux读写内存数据的三种方式 1.read  ,write方式会在用户空间和内核空间不断拷贝数据, ...

  7. Android内存管理(4)*官方教程 含「高效内存的16条策略」 Managing Your App's Memory

    Managing Your App's Memory In this document How Android Manages Memory Sharing Memory Allocating and ...

  8. Java虚拟机垃圾回收:内存分配与回收策略 方法区垃圾回收 以及 JVM垃圾回收的调优方法

    在<Java对象在Java虚拟机中的创建过程>了解到对象创建的内存分配,在<Java内存区域 JVM运行时数据区>中了解到各数据区有些什么特点.以及相关参数的调整,在<J ...

  9. Java虚拟机内存分配与回收策略

    内存分配与回收策略 Minor GC 和 Full GC Minor GC:发生在新生代上,因为新生代对象存活时间很短,因此 Minor GC 会频繁执行, 执行的速度一般也会比较快. Full GC ...

随机推荐

  1. POJ3616-Milking Time-(dp)

    题意:牛有m个时间段可以挤奶,每个时间段的开始时间,结束时间,挤奶量不尽相同,寄完一次需要休息r时间,求在n时间内如何安排牛挤奶产量最大. 解题: 1.休息r时间,当做结束时间需要+r 2.以结束时间 ...

  2. linux学习17 运维核心技能-Linux系统下用户权限管理

    一.权限管理 1.ls -l rwxrwxrwx 左三位:定义user(owner)的权限 中三位:定义group的权限 右三位:定义other的权限 1.进程安全上下文 a.进程对文件的访问权限应用 ...

  3. Numpy | 09 高级索引

    NumPy 比一般的 Python 序列提供更多的索引方式.除了之前看到的用整数和切片的索引外,数组可以由整数数组索引.布尔索引及花式索引. 整数数组索引 实例1:获取数组中(0,0),(1,1)和( ...

  4. Python -- 正则表达式 regular expression

    正则表达式(regular expression) 根据其英文翻译,re模块 作用:用来匹配字符串.  在Python中,正则表达式是特殊的字符序列,检查一个字符串是否与某种模式匹配. 设计思想:用一 ...

  5. 【Beta】“北航社团帮”测试报告——小程序v2.0与网页端v1.0

    目录 测试计划.过程和结果 后端测试--单元测试与覆盖率 后端测试--压力测试 展示部分数据 平均数据 前端测试--小程序v2.0 授权登录与权限检查 新功能的测试 兼容性测试 性能测试 前端测试-- ...

  6. Spring Cloud 学习--Hystrix应用

    上一篇介绍了Hystrix基本功能和单独使用的方式,今天继续学习如何将Hystrix融入SpringCloud组件中去. 在Ribbon上使用熔断器 在 pom.xml 文件中引入 hystrix 的 ...

  7. java字符串格式化性能对比String.format/StringBuilder/+拼接

    String.format由于每次都有生成一个Formatter对象,因此速度会比较慢,在大数据量需要格式化处理的时候,避免使用String.format进行格式化,相反使用StringUtils.l ...

  8. [转]vscodesvn安装和使用

    原文链接:https://blog.csdn.net/wzh66888/article/details/90145340 1.安装svn插件 2.安装成功后会出现这样的图标 如果没有安装之后不能使用, ...

  9. ES6----拓展运算符 三个点【...】

    [...]拓展运算符是什么? es6中引入扩展运算符(...),它用于把一个数组转化为用逗号分隔的参数序列,它常用在不定参数个数时的函数调用,数组合并等情形.因为typeScript是es6的超集,所 ...

  10. QT5.12 qtcreate 在Ubuntu14.04

    Ubuntu14.04 下出现了 symbol dbus_message_get_allow_interactive_authorization, version LIBDBUS_1_3 not de ...