1.成员变量

先来看一下PooledByteBuf的类声明

abstract class PooledByteBuf<T> extends AbstractReferenceCountedByteBuf 

为什么要加模版呢?
他的一个成员protected T memory;由于不知道的T是什么数据类型,所以定义了模板类可以从他的字类中看出来

final class PooledDirectByteBuf extends PooledByteBuf<ByteBuffer>
final class PooledHeapByteBuf extends PooledByteBuf<byte[]>

在前面的学习中,很容易知道,基于内存的ByteBuf是通过操作ByteBuffer的position来实现读写等操作的,而给予堆的ByteBuf是通过Byte数组来实现读写等操作的,因此声明<T>

成员变量有

 private final Recycler.Handle<PooledByteBuf<T>> recyclerHandle;protected PoolChunk<T> chunk;protected long handle;protected T memory;protected int offset;protected int length;int maxLength;Thread initThread;private ByteBuffer tmpNioBuf;

resyclerHandle可以理解为垃圾收集器,负责分配回收内存

PoolChunk<T> chunk可以理解为一个很大的内存区域的一个实例,这个类的成员中又一个PoolArean,就是内存中的一大片区域
netty为了集中管理内存的分配和释放,同时提高分配和释放内存的性能,预先申请一大片内存,然后提供分配和释放接口来使用,这样一来,就能不需要频繁地进行系统的申请和释放内存,应用程序的性能就会大大提升。

2. 初始化

void init(PoolChunk<T> chunk, long handle, int offset, int length, int maxLength) {assert handle >= 0;assert chunk != null;this.chunk = chunk;this.handle = handle;memory = chunk.memory;this.offset = offset;this.length = length;this.maxLength = maxLength;setIndex(0, 0);tmpNioBuf = null;initThread = Thread.currentThread();}

可以知道,memory实际上就是chunk中的数据,initThread实际上就是当前的进程。

3.动态扩展内存

我们在前面的UnpooledHeapByteBuf和UnpooledDirectByteBuf中都看到了这个方法,一个是进行array的增大,一个是对ByteBuf的扩展。

public final ByteBuf capacity(int newCapacity) {ensureAccessible();// If the request capacity does not require reallocation, just update the length of the memory.if (chunk.unpooled) {if (newCapacity == length) {return this;}} else {if (newCapacity > length) {if (newCapacity <= maxLength) {length = newCapacity;return this;}} else if (newCapacity < length) {if (newCapacity > maxLength >>> 1) {if (maxLength <= 512) {if (newCapacity > maxLength - 16) {length = newCapacity;setIndex(Math.min(readerIndex(), newCapacity), Math.min(writerIndex(), newCapacity));return this;}} else { // > 512 (i.e. >= 1024)length = newCapacity;setIndex(Math.min(readerIndex(), newCapacity), Math.min(writerIndex(), newCapacity));return this;}}} else {return this;}}

1.如果chunk内存区是unpooled(没有实现内存池)的话,只有当newCapacity == length时直接返回,其他情况都要重新分配内存。
2.如果chunk内存区实现了内存池,当新的容量大于原来的容量,且小于最大容量时,直接设置原来的容量为新的容量就行。
3.如果新的容量小于原来的容量,那么就要进行减容处理了,先把最大容量>>>1,向右位位移一位(除2),然后根据除2以后的最大容量和新容量对比,分别进行不同的操作。

4.分配回收内存

来看三个方法

 @Overridepublic final ByteBufAllocator alloc() {return chunk.arena.parent;}
   @Overrideprotected final void deallocate() {if (handle >= 0) {final long handle = this.handle;this.handle = -1;memory = null;boolean sameThread = initThread == Thread.currentThread();initThread = null;chunk.arena.free(chunk, handle, maxLength, sameThread);recycle();}}
 private void recycle() {recyclerHandle.recycle(this);}

第一个方法返回ByteBufAllocator对象
第二个方法先销毁原来的内存区,然后重新分配
第三个方法直接回收内存区

总的来说在这个类很容易理解,由于它实现了分配回收内存,还有动态扩展缓存的方法,所以它的字类PooledHeapByteBuf和PooledDirectByteBuf也就不用在实现这些方法啦。

PooledByteBuf源码分析相关推荐

  1. Netty源码分析第5章(ByteBuf)----第5节: directArena分配缓冲区概述

    Netty源码分析第5章(ByteBuf)---->第5节: directArena分配缓冲区概述 Netty源码分析第五章: ByteBuf 第五节: directArena分配缓冲区概述 上 ...

  2. bytebuf池_Netty篇:ByteBuf之内存池源码分析

    Netty的内存池的实现有些复杂,使用了大量的位运算,晦涩难懂,不过万能的博客上好多大神已经介绍的非常详细,推荐四篇很详细很棒的源码分析的文章链接,本文根据自己的理解顺一下思路,内容主要也是出自以下四 ...

  3. 【Golang源码分析】Go Web常用程序包gorilla/mux的使用与源码简析

    目录[阅读时间:约10分钟] 一.概述 二.对比: gorilla/mux与net/http DefaultServeMux 三.简单使用 四.源码简析 1.NewRouter函数 2.HandleF ...

  4. SpringBoot-web开发(四): SpringMVC的拓展、接管(源码分析)

    [SpringBoot-web系列]前文: SpringBoot-web开发(一): 静态资源的导入(源码分析) SpringBoot-web开发(二): 页面和图标定制(源码分析) SpringBo ...

  5. SpringBoot-web开发(二): 页面和图标定制(源码分析)

    [SpringBoot-web系列]前文: SpringBoot-web开发(一): 静态资源的导入(源码分析) 目录 一.首页 1. 源码分析 2. 访问首页测试 二.动态页面 1. 动态资源目录t ...

  6. SpringBoot-web开发(一): 静态资源的导入(源码分析)

    目录 方式一:通过WebJars 1. 什么是webjars? 2. webjars的使用 3. webjars结构 4. 解析源码 5. 测试访问 方式二:放入静态资源目录 1. 源码分析 2. 测 ...

  7. Yolov3Yolov4网络结构与源码分析

    Yolov3&Yolov4网络结构与源码分析 从2018年Yolov3年提出的两年后,在原作者声名放弃更新Yolo算法后,俄罗斯的Alexey大神扛起了Yolov4的大旗. 文章目录 论文汇总 ...

  8. ViewGroup的Touch事件分发(源码分析)

    Android中Touch事件的分发又分为View和ViewGroup的事件分发,View的touch事件分发相对比较简单,可参考 View的Touch事件分发(一.初步了解) View的Touch事 ...

  9. View的Touch事件分发(二.源码分析)

    Android中Touch事件的分发又分为View和ViewGroup的事件分发,先来看简单的View的touch事件分发. 主要分析View的dispatchTouchEvent()方法和onTou ...

最新文章

  1. NLP自然语言常见问题及相关模型训练数据格式示例
  2. 一个用Spring Boot做的垃圾分类小程序,你不拿来学习一下?
  3. Makefile 使用总结
  4. 重写equals方法时必须重写hashcode方法吗
  5. JSP连接数据库 - MySQL
  6. Git学习——提交BUG
  7. c++ 迭代器支持的运算
  8. HTTP 协议 -- 浏览器缓存机制
  9. idea 关于2020maven home directory的路径
  10. 自学python考哪些证书-自学python找什么书?
  11. WordPress 后台评论如何自定义搜索条件
  12. Http请求返回最外层的模型
  13. Java设计模式之十 ---- 访问者模式和中介者模式
  14. 中兴b860a拆机_【中兴ZXV10B860A魔盒外观展示】接口|线材|插线_摘要频道_什么值得买...
  15. 开机出现grub rescue,修复办法
  16. 批处理 获取计算机硬件信息,检测硬件的批处理命令,检测硬件bat,一键获取电脑硬件信息...
  17. 数论系列 求证:设自然数a,b互质,则不能表示成ax+by(x,y为非负整数)的最大整数是ab-a-b
  18. linux解压缩包命令
  19. java反向查找dns_windows – 反向DNS查找
  20. Apple邮箱配置QQ邮箱,163邮箱,edu邮箱,gmail邮箱,获取gmail日历

热门文章

  1. Kafka 对比 ActiveMQ
  2. C++中Struct和Class的区别
  3. ElasticSearch探索之路(一)初识ElasticSearch:特点、应用场景、架构设计、基本概念
  4. 【项目介绍】FTP服务器
  5. 40张最全计算机网络基础思维导图
  6. JDK 14 调试神器了解一下?
  7. Android协程学习
  8. cookie 和 session 详解
  9. 【今晚七点半】:白板与开源
  10. 跨国实时网络调度系统设计