Netty bytebuf 源码解析

来源:互联网 发布:阿里云服务器合同 编辑:程序博客网 时间:2024/04/28 02:22

java nio bytebuffer 和 bytebuf的对比
1. 原生的类长度固定,不能动态扩容和收缩
2. 只有一个读写标志位 position, 操作不灵活
3. API较少,一些适用的操作不支持。

这里写图片描述

ByteBuf 实现类的分配
按内存分配看,
1. 堆内存, 内存分配和回收较快, Socket I/O 读写需要内存复制,会变慢
2. 直接内存。对应上面则较慢, 较快
建议: I/O 通信线程的读写缓冲区使用DirectByteBuf。 后端业务消息的编解码块使用HeapByteBuf.
从内存回收看
1. 基于对象池的ByteBuf. 高负载,大并发
2. 普通ByteBuf。

writeBytes(ByteBuf src, int srcIndex, int length)
扩容方式: 固定阈值是4mb, 如果大于4M 就采用步长的增长方式
小于4m的就用倍数的增长方式。步长和倍数两种方式混合使用,目的就是为了有效利用空间。

UnpooledHeapByteBuf 基于堆,没有基于对象池技术实现,每一次I/O 读写都会创建一个新的

PooledDirectByteBuf 对象池技术 与UnPo….不同的是内存分配策略不太一样。
一次性申请一大块内存,这样就不需要频繁地申请和释放内存了。

chunk 16个page, 一个page 4个字节, 二叉树。
page
PoolSubpage page中的内存分配,取决于第一块的内存大小。

ByteBuf 辅助类
ByteBufHolder 封装一个ByteBuf ,添加其他的辅助方法,例如http 消息体
CompositeByteBuf 将多个ByteBuf组合在一起,相当于视图的功能。
ByteBufAllocator 字节缓冲分配器 (两种基于内存池和普通)

原创粉丝点击