ByteBuf源码分析

ByteBuf源码分析

分配原理

简单结构图

  1. [0, readerIndex) 此区间表示当前已经丢弃的数据,不可再读,也不能再利用;
  2. [readerIndex, writerIndex) 此区间表示当前可读取到的数据;
  3. [writerIndex, capacity) 此区间表示当前可以写入的范围
  4. [capacity, maxCapacity] 此区间表示可扩容的范围

进阶版结构图

  1. [initial, markReaderIndex) 此区间的数据已经被丢弃,无法重利用
  2. [markerReaderIndex, readerIndex) 此区间的数据表示可以重利用
  3. [readerIndex, writerIndex) 此区间表示当前可读到的数据
  4. [markerWriterIndex, writerIndex) 此区间的数据表示可以丢弃,可以再次进行覆盖写入
  5. [writerIndex, capacity) 此区间表示可以写入的范围
  6. [capacity, maxCapacity] 此区间表示可扩容的范围

附一张源码中截图

类图

比较繁多,这里只列举关键的、常用的几种类

  1. 内存对象是否池化;Pooled,Unpooled
  2. 内存对象是否通过Unsafe接口提供的地址指针进行操作;
  3. 内存对象保存的堆外、堆内内存;Direct、Heap
  4. 是否组合,Composite

常见操作

1、 getXX

作用:获取指定位置的数据

有getByte、getInt、getLong等; 以getByte为例;在AbstractByteBuf中定义_getByte()方法抽象,由具体的子类进行根据不同的行为来实现;

比如:UnpooledHeapByteBuf._getByte()是通过HeapByteBufUtil直接通过索引才进行查找

java 复制代码
protected byte _getByte(int index) {
    return HeapByteBufUtil.getByte(array, index);
}

// io.netty.buffer.HeapByteBufUtil#getByte
static byte getByte(byte[] memory, int index) {
    return memory[index];
}

再比如:UnpooledDirectByteBuf._getByte()直接调用DirectByteBuffer来进行查找的

arduino 复制代码
protected byte _getByte(int index) {
    return buffer.get(index);
}

再比如:UnpooledUnsafeDirectByteBuf._getByte()是通过DirectByteBufUtil,通过Unsafe API的方式,利用内存地址进行快速索引;(跳过了DirectByteBuffer接口)

java 复制代码
protected byte _getByte(int index) {
    return UnsafeByteBufUtil.getByte(addr(index));
}

// after some invokes
......

static byte getByte(long address) {
    return UNSAFE.getByte(address);
}

2、 writeXX

作用: 写入一些内容;

布局思想:write和get类型,

3、 setXX

作用:在指定位置,写入一些元素;

使用手册

通过ByteBufAllocator进行分配;

PooledByteBufAllocator

  1. 可以分配池化的对象;
  2. 通过调用directBuffer、headBuffer方法进行分配

UnpooledByteBufAllocator

  1. 分配非池化对象
  2. 调用directBuffer、heapBuffer方法决定在哪块内存上进行分配

至于ByteBufAllocator如何进行分配,且听下期分享

参看网址

Netty源码深入剖析

相关推荐
漫步者TZ2 天前
【Netty系列】解决TCP粘包和拆包:LengthFieldBasedFrameDecoder
java·网络协议·tcp/ip·netty
安徽杰杰2 天前
智慧赋能:移动充电桩的能源供给革命与便捷服务升级
netty
安徽杰杰3 天前
智慧赋能:新能源汽车充电桩应用现状与管理升级方案
netty
触角云科技7 天前
智慧充电桩数字化管理平台:环境监测与动态数据可视化技术有哪些作用?
netty
猫咪老师QAQ7 天前
Netty 实战篇:Netty RPC 框架整合 Spring Boot,迈向工程化
netty
猫咪老师QAQ7 天前
Netty 实战篇:为 Netty RPC 框架引入调用链追踪,实现链路透明化
netty
漫步者TZ8 天前
【Netty系列】实现HTTP文件服务器
http·网络编程·netty
猫咪老师QAQ8 天前
Netty 实战篇:构建简易注册中心,实现服务发现与调用路由
netty
触角云科技8 天前
充电便捷,新能源汽车移动充电服务如何预约充电
netty
漫步者TZ8 天前
【Netty系列】Reactor 模式 2
设计模式·netty