数据结构学的烂,看这个类比较的吃力

PoolChunk主要使用long allocate(int normCapacity) 在buffer pool中分配buffer。这个类有几个重要的概念:page:是chunk中内存分配的最小单元,chunk:表示一系列的page, 一个chunk的大小chunksize=2{maxorder}*pageSize。

首先需要分配一个长度等于chunksize的字节数组,当需要从中分配一个bytebuf时,返回一个第一个有足够空间满足这个bytebuf大小的位置。然后标记这块缓冲不可再分配了,除非该bytebuf释放。

为了在chunk中搜索满足大小的内存快的偏移,我们需要构造一个完全满二叉树,该二叉树使用byte[]存储-memoryMap,该二叉树的深度为maxOrder+1,从0开始计数,

0                                           1

1                                    2                  3

2                                4       5         6       7

3                            8    9 10  11 12  13  14 15

maxOrder

这个满二叉树,每个叶子结点标识一个page的使用状态,根结点就标识整个chunk的使用状态。 二叉树的length为2{maxorder+1}*pageSize.  [0]不存储值

在chunk中分配算法如下,如果要分配一个chunksize/2{k},我们将从第k层从左到到右中寻找未使用的节点。

memoryMap[id]=depth_of_id   =>没有使用

memoryMap[id]>depth_of_id   =>他的子结点被分配了,该结点不能分配,但是他的子结点还可以被分配。

memoryMap[id]=maxorder+1   =>子结点完全分配完了

allocateNode(d)的算法如下:

1:从root结点开始(depth=0或者id=1)

2: 如果memoryMap[1]>d 该chunk无缓冲非陪

3:如果左结点的值<=h,我们从左子树开始一直向左移动

4:否则试下右子树

netty中的PoolChunk的更多相关文章

  1. Netty 中的内存分配浅析

    Netty 出发点作为一款高性能的 RPC 框架必然涉及到频繁的内存分配销毁操作,如果是在堆上分配内存空间将会触发频繁的GC,JDK 在1.4之后提供的 NIO 也已经提供了直接直接分配堆外内存空间的 ...

  2. Netty 中的内存分配浅析-数据容器

    本篇接续前一篇继续讲 Netty 中的内存分配.上一篇 先简单做一下回顾: Netty 为了更高效的管理内存,自己实现了一套内存管理的逻辑,借鉴 jemalloc 的思想实现了一套池化内存管理的思路: ...

  3. Netty(五)序列化protobuf在netty中的使用

    protobuf是google序列化的工具,主要是把数据序列化成二进制的数据来传输用的.它主要优点如下: 1.性能好,效率高: 2.跨语言(java自带的序列化,不能跨语言) protobuf参考文档 ...

  4. 【转】Netty那点事(二)Netty中的buffer

    [原文]https://github.com/code4craft/netty-learning/blob/master/posts/ch2-buffer.md 上一篇文章我们概要介绍了Netty的原 ...

  5. Netty那点事: 概述, Netty中的buffer, Channel与Pipeline

    Netty那点事(一)概述 Netty和Mina是Java世界非常知名的通讯框架.它们都出自同一个作者,Mina诞生略早,属于Apache基金会,而Netty开始在Jboss名下,后来出来自立门户ne ...

  6. Netty中的EventLoop和线程模型

    一.前言 在学习了ChannelHandler和ChannelPipeline的有关细节后,接着学习Netty的EventLoop和线程模型. 二.EventLoop和线程模型 2.1. 线程模型 线 ...

  7. Netty中的连接管理

    连接管理是我们首先需要关注的,检测空闲连接以及超时对于及时释放资源来说是至关重要的.由于这是一项常见的任务,Netty特地为它提供了几个ChannelHandler实现. 用于空闲连接以及超时的Cha ...

  8. Netty中ByteBuf的引用计数线程安全的实现原理

    原文链接 Netty中ByteBuf的引用计数线程安全的实现原理 代码仓库地址 ByteBuf 实现了ReferenceCounted 接口,实现了引用计数接口,该接口的retain(int) 方法为 ...

  9. Netty中的基本组件及关系

    原文:https://blog.csdn.net/summerZBH123/article/details/79344226---------------------  概述    这篇文章主要是用来 ...

随机推荐

  1. php mysql 查询

    抓取结果集对象中数据并且转换数组 $row = mysqli_fetch_assoc(结果集对象); 从结果集对象中抓取一行记录->转换关联数组 $row = mysqli_fetch_row( ...

  2. C# WebApi 配置复杂路由不生效的问题

    配置复杂路由不生效是由于优先级的关系,应该把默认路由放在最后. config.Routes.MapHttpRoute( name: "DynamicApi", routeTempl ...

  3. Git中从远程的分支获取最新的版本到本地方式

    Git中从远程的分支获取最新的版本到本地方式如下, 如何更新下载到代码到本地,请参阅ice的博客基于Github参与eoe的开源项目指南 方式一 . 查看远程仓库 $ git remote -v eo ...

  4. innoDB 下主键的思考

    主键 表中每一行都应该有可以唯一标识自己的一列(或一组列). 一个顾客可以使用顾客编号列,而订单可以使用订单ID,雇员可以使用雇员ID 或 雇员社会保险号. 主键(primary key) 一列(或一 ...

  5. java-04类和对象课堂练习

    1.请运行并输入以下代码,得到什么结果 public class Test { public static void main(String[] args){ Foo obj1=new Foo(); ...

  6. 基于Python语言使用RabbitMQ消息队列(一)

    介绍 RabbitMQ 是一个消息中间人(broker): 它接收并且发送消息. 你可以把它想象成一个邮局: 当你把想要寄出的信放到邮筒里时, 你可以确定邮递员会把信件送到收信人那里. 在这个比喻中, ...

  7. BZOJ2565:最长双回文串

    浅谈\(Manacher\):https://www.cnblogs.com/AKMer/p/10431603.html 题目传送门:https://www.lydsy.com/JudgeOnline ...

  8. UITableView常见用法以及注意细节

    UITableView用途广泛,而且多样化,其中有一些不太常用,用到的话需要去查资料,今天边用边记录下来 *第一发:UITableViewCell 分割线 1. 分割线样式 [self.tableVi ...

  9. 用Unreal Engine绘制实时CG影像

    转自:http://www.unrealchina.net/portal.php?mod=view&aid=225 近年来,对实时CG的关心热度越来越高,但要想弥补与预渲染方式的差异并不是那么 ...

  10. mybatis 学习六 MyBatis主配置文件

    在定义sqlSessionFactory时需要指定MyBatis主配置文件: <bean id="sqlSessionFactory" class="org.myb ...