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源码深入剖析

相关推荐
不早睡不改名@4 天前
Netty源码分析---Reactor线程模型深度解析(一)
java·笔记·学习·netty
zs宝来了4 天前
Netty Reactor 模型:Boss、Worker 与 EventLoop
reactor·netty·源码解析·线程模型·eventloop
不早睡不改名@5 天前
Netty源码分析---Reactor线程模型深度解析(二)
java·网络·笔记·学习·netty
不早睡不改名@5 天前
Netty源码解析---FastThreadLocal-addToVariablesToRemove方法详解
java·网络·笔记·学习·netty
MrSYJ14 天前
有没有人懂socketChannel中的write,read方法啊,给我讲讲
java·程序员·netty
尽兴-18 天前
RocketMQ核心源码深度解读:架构原理与核心机制剖析
架构·rocketmq·netty·架构原理·消息持久化
Javatutouhouduan19 天前
Netty进阶指南:基础+中级+高级+架构行业运用+源码分析
java·netty·java面试·网络io·后端开发·java程序员·互联网大厂
MrSYJ22 天前
Netty异常传播机制
java·服务器·netty
qq_2320455724 天前
精积微半导体面试(部分)
netty·策略模式·nio·内存抖动·threadlocal·bitmap·复用
一叶飘零_sweeeet1 个月前
从 BIO 到 AIO 全链路拆解:Reactor 模型演进与高并发 IO 架构落地实战
netty·nio