netty内存数据缓冲区使用策略
主要是通过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;
netty内存数据缓冲区使用策略的更多相关文章
- Netty 内存回收之 noCleaner 策略
前言 对于堆外内存,使用 System.gc() 是不靠谱的,依赖老年代 FGC 也是不靠谱的,而且大部分调优指南都设置了 -DisableExplicitGC 禁用 System.gc().所以主动 ...
- 感悟优化——Netty对JDK缓冲区的内存池零拷贝改造
NIO中缓冲区是数据传输的基础,JDK通过ByteBuffer实现,Netty框架中并未采用JDK原生的ByteBuffer,而是构造了ByteBuf. ByteBuf对ByteBuffer做了大量的 ...
- 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 ...
- Netty内存池及命中缓存的分配
内存池的内存规格: 在前面的源码分析过程中,关于内存规格大小我们应该还有些印象.其实在Netty 内存池中主要设置了四种规格大小的内存:tiny 是指0-512Byte 之间的规格大小,small 是 ...
- 一文搞懂 Netty 发送数据全流程 | 你想知道的细节全在这里
欢迎关注公众号:bin的技术小屋,如果大家在看文章的时候发现图片加载不了,可以到公众号查看原文 本系列Netty源码解析文章基于 4.1.56.Final版本 在<Netty如何高效接收网络数据 ...
- Linux就这个范儿 第18章 这里也是鼓乐笙箫 Linux读写内存数据的三种方式
Linux就这个范儿 第18章 这里也是鼓乐笙箫 Linux读写内存数据的三种方式 P703 Linux读写内存数据的三种方式 1.read ,write方式会在用户空间和内核空间不断拷贝数据, ...
- Android内存管理(4)*官方教程 含「高效内存的16条策略」 Managing Your App's Memory
Managing Your App's Memory In this document How Android Manages Memory Sharing Memory Allocating and ...
- Java虚拟机垃圾回收:内存分配与回收策略 方法区垃圾回收 以及 JVM垃圾回收的调优方法
在<Java对象在Java虚拟机中的创建过程>了解到对象创建的内存分配,在<Java内存区域 JVM运行时数据区>中了解到各数据区有些什么特点.以及相关参数的调整,在<J ...
- Java虚拟机内存分配与回收策略
内存分配与回收策略 Minor GC 和 Full GC Minor GC:发生在新生代上,因为新生代对象存活时间很短,因此 Minor GC 会频繁执行, 执行的速度一般也会比较快. Full GC ...
随机推荐
- POJ3616-Milking Time-(dp)
题意:牛有m个时间段可以挤奶,每个时间段的开始时间,结束时间,挤奶量不尽相同,寄完一次需要休息r时间,求在n时间内如何安排牛挤奶产量最大. 解题: 1.休息r时间,当做结束时间需要+r 2.以结束时间 ...
- linux学习17 运维核心技能-Linux系统下用户权限管理
一.权限管理 1.ls -l rwxrwxrwx 左三位:定义user(owner)的权限 中三位:定义group的权限 右三位:定义other的权限 1.进程安全上下文 a.进程对文件的访问权限应用 ...
- Numpy | 09 高级索引
NumPy 比一般的 Python 序列提供更多的索引方式.除了之前看到的用整数和切片的索引外,数组可以由整数数组索引.布尔索引及花式索引. 整数数组索引 实例1:获取数组中(0,0),(1,1)和( ...
- Python -- 正则表达式 regular expression
正则表达式(regular expression) 根据其英文翻译,re模块 作用:用来匹配字符串. 在Python中,正则表达式是特殊的字符序列,检查一个字符串是否与某种模式匹配. 设计思想:用一 ...
- 【Beta】“北航社团帮”测试报告——小程序v2.0与网页端v1.0
目录 测试计划.过程和结果 后端测试--单元测试与覆盖率 后端测试--压力测试 展示部分数据 平均数据 前端测试--小程序v2.0 授权登录与权限检查 新功能的测试 兼容性测试 性能测试 前端测试-- ...
- Spring Cloud 学习--Hystrix应用
上一篇介绍了Hystrix基本功能和单独使用的方式,今天继续学习如何将Hystrix融入SpringCloud组件中去. 在Ribbon上使用熔断器 在 pom.xml 文件中引入 hystrix 的 ...
- java字符串格式化性能对比String.format/StringBuilder/+拼接
String.format由于每次都有生成一个Formatter对象,因此速度会比较慢,在大数据量需要格式化处理的时候,避免使用String.format进行格式化,相反使用StringUtils.l ...
- [转]vscodesvn安装和使用
原文链接:https://blog.csdn.net/wzh66888/article/details/90145340 1.安装svn插件 2.安装成功后会出现这样的图标 如果没有安装之后不能使用, ...
- ES6----拓展运算符 三个点【...】
[...]拓展运算符是什么? es6中引入扩展运算符(...),它用于把一个数组转化为用逗号分隔的参数序列,它常用在不定参数个数时的函数调用,数组合并等情形.因为typeScript是es6的超集,所 ...
- QT5.12 qtcreate 在Ubuntu14.04
Ubuntu14.04 下出现了 symbol dbus_message_get_allow_interactive_authorization, version LIBDBUS_1_3 not de ...