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;

原文地址:https://www.cnblogs.com/zzq-include/p/12072026.html

时间: 2024-11-02 21:28:52

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

内存分配有哪些策略

1.内存分配有哪些策略 我们从编译原理讲起,不同的开发环境.开发语言都会有不同的策略.一般来说,程序运行时有三种内存分配策略:静态的.栈式的.堆式的 静态存储是指在编译时就能够确定每个数据目标在运行时的存储空间需求,因而在编译时就可以给它们分配固定的内存空间. 这种分配策略要求程序代码中不允许有可变数据结构的存在,也不允许有嵌套或者递归的结构出现,因为它们都会导致编译程序无法计算准确的存储空间. 栈式存储栈式存储分配是动态存储分配,是由一个类似于堆栈的运行栈来实现的,和静态存储的分配方式相反. 

揭秘12306技术改造(三):传统框架云化迁移到内存数据平台

摘要:此篇文章列举不同类型的系统改造迁移到云平台方案,从改造思路探讨,系统框架设计和项目实施的整个迁移过程,供大家参考和交流. 注:本文首发于CSDN,转载请标明出处. [编者按]在年前的「技术揭秘12306改造」专题中,负责12306改造的技术架构师刘云程从技术的角度.用科学论证的方式说明 12306是如何实现高流量高并发的关键技术,以及深入探讨了12306两地三中心混合云架构,今天,他继续为大家带来第三篇:传统框架云化迁移到内存数据平台. 以下为正文>> 摘要 12306混合云成功案例给予

架构高性能站点秘笈(六)——构建数据缓冲区

到此为止,一共介绍了四种server性能优化的方法.各自是:动态内容缓存.浏览器缓存.反向代理缓存.Web组件分离. 我们发如今这四种方法中,"缓存"占了大头! 确实如此,"缓存"是server性能优化的核心思想.我们提出的各种优化方法本质上仅仅是把"缓存"用在了不同的地方.并依据使用位置的不同,个性化定制缓存的用法.接下来又要介绍一种缓存的新用法--数据缓冲区. 之前介绍的动态内容缓存.浏览器缓存都是将整个静态页面进行缓存.这样的方式有个弊端:

Java千百问_07JVM架构(003)_内存分配有哪些策略

点击进入_更多_Java千百问 1.内存分配有哪些策略 我们从编译原理讲起,不同的开发环境.开发语言都会有不同的策略.一般来说,程序运行时有三种内存分配策略:静态的.栈式的.堆式的 静态存储 是指在编译时就能够确定每个数据目标在运行时的存储空间需求,因而在编译时就可以给它们分配固定的内存空间. 这种分配策略要求程序代码中不允许有可变数据结构的存在,也不允许有嵌套或者递归的结构出现,因为它们都会导致编译程序无法计算准确的存储空间. 栈式存储 栈式存储分配是动态存储分配,是由一个类似于堆栈的运行栈来

几种内存数据的总结

MemSQL 原理:将不用锁的数据结构和即时编译器结合起来应对大容量的工作负载,在内存中实现了免锁的hashtable和免锁skiplists(一种层级关系的链表结构)来快速随机访问数据. 持久性:MemSQL尽管在内存中存数据,可以通过写日志和快照(类似于checkpoint)对数据持久化到磁盘 复制:MemSQL目前支持master-slave的复制方式,它支持本地复制协议能将事务日志转运到slave上. 分布式架构:基于聚合器和叶子节点的理念进行工作,一个叶子节点就是一个MemSQL的数据

JVM内存模型及垃圾收集策略解析

AD: JVM内存模型是Java的核心技术之一,之前51CTO曾为大家介绍过JVM分代垃圾回收策略的基础概念,现在很多编程语言都引入了类似Java JVM的内存模型和垃圾收集器的机制,下面我们将主要针对Java中的JVM内存模型及垃圾收集的具体策略进行综合的分析. 一 JVM内存模型 1.1 Java栈 Java栈是与每一个线程关联的,JVM在创建每一个线程的时候,会分配一定的栈空间给线程.它主要用来存储线程执行过程中的局部变量,方法的返回值,以及方法调用上下文.栈空间随着线程的终止而释放.St

java虚拟机(3)--内存分配与回收策略

三.内存分配与回收策略 1.1 Minor GC 和 Full GC Minor GC:发生在新生代上,因为新生代对象存活时间很短,因此 Minor GC 会频繁执行,执行的速度一般也会比较快. Full GC:发生在老年代上,老年代对象其存活时间长,因此 Full GC 很少执行,执行速度会比 Minor GC 慢很多. 1.2 内存分配策略 1.2.1            对象优先在 Eden 分配 大多数情况下,对象在新生代 Eden 区分配,当 Eden 区空间不够时,发起 Minor

面试官:Redis 数据库内存数据满了,会宕机吗?有内存回收?

Redis 数据库内存数据满了,会宕机吗?答案是:不会让他出现存满的情况,在使用Redis的时候我们要配置Redis能使用的最大的内存大小,存到一定容量的时候还有Redis的内存淘汰策略呢,还有LRU算法进行淘汰,等等...接下来就跟着作者一起探讨,Redis的内存淘汰策略. Redis占用内存大小 我们知道Redis是基于内存的key-value数据库,因为系统的内存大小有限,所以我们在使用Redis的时候可以配置Redis能使用的最大的内存大小. 1.通过配置文件配置 通过在Redis安装目

Innodb额外内存池的分配策略以及性能

Innodb额外内存池的分配策略以及性能 作者:明天会更好 QQ:715169549 备注:未经同意,严禁转载,谢谢合作. //内存池结构体 /** Data structure for a memory pool. The space is allocated using the buddy algorithm, where free list i contains areas of size 2 to power i. */ struct mem_pool_t{ byte* buf; /*!