Netty bytebuf 源码解析

本文对比分析了Java NIO中的ByteBuffer与Netty中的ByteBuf特性,包括内存管理、API支持及性能表现等方面,并探讨了不同场景下两者的最佳实践。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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 字节缓冲分配器 (两种基于内存池和普通)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值