Netty源码分析第5章(ByteBuf)---->第3节: 缓冲区分配器
Netty源码分析第五章: ByteBuf
第三节: 缓冲区分配器
缓冲区分配器, 顾明思议就是分配缓冲区的工具, 在netty中, 缓冲区分配器的顶级抽象是接口ByteBufAllocator, 里面定义了有关缓冲区分配的相关api
抽象类AbstractByteBufAllocator实现了ByteBufAllocator接口, 并且实现了其大部分功能
和AbstractByteBuf一样, AbstractByteBufAllocator也实现了缓冲区分配的骨架逻辑, 剩余的交给其子类
以其中的分配ByteBuf的方法为例, 对其做简单的介绍:
public ByteBuf buffer() {
if (directByDefault) {
return directBuffer();
}
return heapBuffer();
}
这里if (directByDefault)会判断默认创建的ByteBuf是不是一个基于直接内存的ByteBuf, 也就是direct类型的ByteBuf, 如果是, 则通过directBuffer()方法返回direct类型的ByteBuf, 否则, 会通过heapBuffer()返回heap类型的ByteBuf
跟到directBuffer()方法中:
public ByteBuf directBuffer() {
return directBuffer(DEFAULT_INITIAL_CAPACITY, Integer.MAX_VALUE);
}
这里又调用了一个重载directBuffer方法, 其中DEFAULT_INITIAL_CAPACITY代表分配的默认容量, Integer.MAX_VALUE表示分配的ByteBuf可扩容的最大容量, 也就是Integer类型的最大值, 我们再跟进去:
public ByteBuf directBuffer(int initialCapacity, int maxCapacity) {
if (initialCapacity == 0 && maxCapacity == 0) {
return emptyBuf;
}
validate(initialCapacity, maxCapacity);
return newDirectBuffer(initialCapacity, maxCapacity);
}
这里判断如果初始容量和最大容量都为0的话, 则返回一个emptyBuf的成员变量, emptyBuf代表一个空的ByteBuf
然后通过validate方法进行参数验证
最后newDirectBuffer创建一个Direct类型的ByteBuf, 并将初始容量和最大容量传入
在AbstractByteBufAllocator中, newDirectBuffer是一个抽象方法, 由其子类实现
protected abstract ByteBuf newDirectBuffer(int initialCapacity, int maxCapacity);
我们回到缓冲区分配的方法:
public ByteBuf buffer() {
if (directByDefault) {
return directBuffer();
}
return heapBuffer();
}
刚才简单剖析了directBuffer()的分配, 现在在继续跟到heapBuffer()中, 看其分配heap类型的ByteBuf的抽象逻辑:
public ByteBuf heapBuffer() {
return heapBuffer(DEFAULT_INITIAL_CAPACITY, Integer.MAX_VALUE);
}
这里同样调用了重载的heapBuffer, 并传入了初始容量和最大容量
再继续跟heapBuffer方法:
public ByteBuf heapBuffer(int initialCapacity, int maxCapacity) {
if (initialCapacity == 0 && maxCapacity == 0) {
return emptyBuf;
}
validate(initialCapacity, maxCapacity);
return newHeapBuffer(initialCapacity, maxCapacity);
}
同样, 这里如果初始容量和最大容量都为空的话, 返回一个代表空的ByteBuf
然后通过validate方法进行参数验证
最后通过newHeapBuffer方法创建一个新的heap类型的ByteBuf
同样, newHeapBuffer方法在AbstractByteBufAllocator中也是一个抽象方法, 具体逻辑交给其子类实现
protected abstract ByteBuf newHeapBuffer(int initialCapacity, int maxCapacity);
newDirectBuffer和newHeapBuffer两个抽象方法中, 在其子类PooledByteBufAllocator和UnpooledByteBufAllocator中都有实现
我们以UnpooledByteBufAllocator的newHeapBuffer方法为例, 看其实现:
protected ByteBuf newHeapBuffer(int initialCapacity, int maxCapacity) {
return PlatformDependent.hasUnsafe() ? new UnpooledUnsafeHeapByteBuf(this, initialCapacity, maxCapacity)
: new UnpooledHeapByteBuf(this, initialCapacity, maxCapacity);
}
里实现方式其实很简单, 首先通过PlatformDependent.hasUnsafe()判断当前运行环境是否能创建unsafe对象, 如果能, 则直接通过new UnpooledUnsafeHeapByteBuf(this, initialCapacity, maxCapacity)方式创建一个UnpooledUnsafeHeapByteBuf对象, 也就是一个Unsafe的ByteBuf对象
如果当前环境不能创建unsafe对象, 则通过new UnpooledHeapByteBuf(this, initialCapacity, maxCapacity)这种方方式创建一个UnpooledHeapByteBuf对象, 也就是非Unsafe的ByteBuf对象
从这里能看出, 其实在创建ByteBuf对象时, 是否创建unsafe类型的对象并不是我们自己控制的, 而是通过程序判断当前环境来决定是否创建unsafe类型的ByteBuf对象的
有关ByteBufAllocator的继承关系如下:

5-3-1
Netty源码分析第5章(ByteBuf)---->第3节: 缓冲区分配器的更多相关文章
- Netty源码分析第5章(ByteBuf)---->第4节: PooledByteBufAllocator简述
Netty源码分析第五章: ByteBuf 第四节: PooledByteBufAllocator简述 上一小节简单介绍了ByteBufAllocator以及其子类UnPooledByteBufAll ...
- Netty源码分析第5章(ByteBuf)---->第5节: directArena分配缓冲区概述
Netty源码分析第五章: ByteBuf 第五节: directArena分配缓冲区概述 上一小节简单分析了PooledByteBufAllocator中, 线程局部缓存和arean的相关逻辑, 这 ...
- Netty源码分析第5章(ByteBuf)---->第6节: 命中缓存的分配
Netty源码分析第6章: ByteBuf 第六节: 命中缓存的分配 上一小节简单分析了directArena内存分配大概流程, 知道其先命中缓存, 如果命中不到, 则区分配一款连续内存, 这一小节带 ...
- Netty源码分析第5章(ByteBuf)---->第7节: page级别的内存分配
Netty源码分析第五章: ByteBuf 第六节: page级别的内存分配 前面小节我们剖析过命中缓存的内存分配逻辑, 前提是如果缓存中有数据, 那么缓存中没有数据, netty是如何开辟一块内存进 ...
- Netty源码分析第5章(ByteBuf)---->第10节: SocketChannel读取数据过程
Netty源码分析第五章: ByteBuf 第十节: SocketChannel读取数据过程 我们第三章分析过客户端接入的流程, 这一小节带大家剖析客户端发送数据, Server读取数据的流程: 首先 ...
- Netty源码分析第5章(ByteBuf)---->第1节: AbstractByteBuf
Netty源码分析第五章: ByteBuf 概述: 熟悉Nio的小伙伴应该对jdk底层byteBuffer不会陌生, 也就是字节缓冲区, 主要用于对网络底层io进行读写, 当channel中有数据时, ...
- Netty源码分析第5章(ByteBuf)---->第2节: ByteBuf的分类
Netty源码分析第五章: ByteBuf 第二节: ByteBuf的分类 上一小节简单介绍了AbstractByteBuf这个抽象类, 这一小节对其子类的分类做一个简单的介绍 ByteBuf根据不同 ...
- Netty源码分析第5章(ByteBuf)---->第8节: subPage级别的内存分配
Netty源码分析第五章: ByteBuf 第八节: subPage级别的内存分配 上一小节我们剖析了page级别的内存分配逻辑, 这一小节带大家剖析有关subPage级别的内存分配 通过之前的学习我 ...
- Netty源码分析第5章(ByteBuf)---->第9节: ByteBuf回收
Netty源码分析第五章: ByteBuf 第九节: ByteBuf回收 之前的章节我们提到过, 堆外内存是不受jvm垃圾回收机制控制的, 所以我们分配一块堆外内存进行ByteBuf操作时, 使用完毕 ...
随机推荐
- loli的搜索测试-4
其实这已经是第四次搜索测试了...只不过上两次测试时我不在学校,扔两个链接吧: 测试-2:https://www.luogu.org/blog/user35178/loli-di-sou-suo-ce ...
- virtualbox+vagrant学习-2(command cli)-21-vagrant up命令
Up 格式: vagrant up [options] [name|id] 这个命令根据你的Vagrantfile文件创建和配置客户机. 这是“vagrant”中最重要的一个命令,因为它是创建任何va ...
- cascade rcnn论文总结
1.bouding box regression总结: rcnn使用l2-loss 首先明确l2-loss的计算规则: L∗=(f∗(P)−G∗)2,∗代表x,y,w,h 整个loss : L= ...
- $python爬虫系列(2)—— requests和BeautifulSoup库的基本用法
本文主要介绍python爬虫的两大利器:requests和BeautifulSoup库的基本用法. 1. 安装requests和BeautifulSoup库 可以通过3种方式安装: easy_inst ...
- jsonp封装方法二
前言: 看到玉伯的聊聊jsonp的p,引发了另一种loader方式来跨域的方法,他把它叫做JSONM协议,原理和seajs相似,都是动态加载script,加载完成后执行callback, 同时还不用考 ...
- OVF3为订单原因分配成本中心时报错“成本中心未定义”,消息号:VT806
问题:OVF3为订单原因分配成本中心时报错“成本中心未定义”,消息号:VT806.KS03检查成本中心数据是已经建立的. 原因:OVF3往右边拉动,还有一个需要填入的字段“有效起始日”,此字段值必须在 ...
- Linux学习笔记(第九章)
压缩概念: gzip和zcat: 先进版bzip2,bzcat bzip -d 已压缩文档名 bzip -z 需压缩文档名 bzcat 解压文档打印到屏幕 tar:打包指令 注意:压缩最好拿掉根目录 ...
- Homebrew 使用指南
Homebrew 是 MacOSX 上的软件包管理工具. 安装 /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.co ...
- vue中使用codemirror
https://blog.csdn.net/oumaharuki/article/details/79268498 别人的记载,写的很不错,还有下载的方法 以下是自己使用过的,做出来的例子: 做出来 ...
- 在centos环境下编译安装myrocksdb
rocksdb(https://rocksdb.org.cn/)是脸书(facebook)公司开源的一个key-value存储引擎,基于leveldb开发.rocksdb使用的是LSM存储引擎,纯c+ ...