Netty ByteBuf 分配 | 池化复用 、直接内存
创作时间:
作者:
@小白创作中心
Netty ByteBuf 分配 | 池化复用 、直接内存
引用
CSDN
1.
https://blog.csdn.net/happycao123/article/details/143578967
Netty ByteBuf 分配
本文主要内容关于 ByteBuf 分配介绍,为了更好的理解本文,我们可以带着几个问题思考:
- 在IO密集型业务场景下,可能涉及大量ByteBuf分配,这时我们需要考虑会不会产生OOM
- 会不会出现频繁GC
- 会不会内存泄露
根据上面的问题,没准你也设计出netty的分配方案,主要关键点:
- 避免重复分配,你也许会想到 线程池类似的复用技术
- 解放GC,你会如何绕过GC ,于是想到直接内存,因为直接内存需要手动释放资源,因此你需要考虑潜在的内存泄露问题
ByteBufAllocator
ByteBufAllocator 是 Netty用于分配 ByteBuf 对象 的接口,ByteBuf 分配方式主要有下面两个维度:
- 在堆上分配还是使用直接内存
- 堆上分配,受JVM 垃圾回收管理,不需要手动释放资源。
- 直接内存不受JVM垃圾收集机制的管理,需要手动释放资源,在处理I/O操作时,直接内存可以提高性能,因为它减轻垃圾收集的压力
- 使用缓存池复用 和 不使用缓存池
- 池化技术我们平常接触的有数据库连接池、线程池等,它避免资源重复创建和销毁带来的代价,Netty 对象分配也支持用缓冲池复用。
ByteBufAllocator 分配方法介绍
- buffer()
- 自动判断在堆上分配 or 直接内存上分配(判断依据是否支持Unsafe)
- ioBuffer()
- 尽可能在对直接内存上分配,因为直接内存更适合用于IO,如果不支持则在堆上分配。
- heapBuffer()
- 在堆上分配,受垃圾回收机制管理
- directBuffer()
- 使用直接内存分配
- CompositeByteBuf 分配
- compositeBuffer()/compositeHeapBuffer()/compositeDirectBuffer()/ 用于CompositeByteBuf 分配
ByteBufAllocator 主要实现类
- PooledByteBufAllocator
- 使用缓冲池技术,通过重复利用已经分配的ByteBuf,能够有效地减少内存分配和释放的开销。
- UnpooledByteBufAllocator
- 它在每次分配ByteBuf时都会创建一个新的实例。
Unpooled
非池化分配也可以使用Unpooled 工具类,Unpooled 工具类其实调用UnpooledByteBufAllocator进行分配的,它提供了许多便捷的静态方法。
使用举例
import io.netty.buffer.ByteBuf;
import io.netty.buffer.ByteBufAllocator;
import io.netty.buffer.PooledByteBufAllocator;
import io.netty.buffer.UnpooledByteBufAllocator;
public class ByteBufAllocatorExample {
public static void main(String[] args) {
// 使用池化分配器
ByteBufAllocator pooledAllocator = PooledByteBufAllocator.DEFAULT;
// 分配一个堆内存 ByteBuf
ByteBuf heapBuf = pooledAllocator.heapBuffer(1024);
heapBuf.writeBytes("Hello, Heap Buffer!".getBytes());
System.out.println("Heap Buffer: " + heapBuf.toString(io.netty.util.CharsetUtil.UTF_8));
heapBuf.release();
// 分配一个直接内存 ByteBuf
ByteBuf directBuf = pooledAllocator.directBuffer(1024);
directBuf.writeBytes("Hello, Direct Buffer!".getBytes());
System.out.println("Direct Buffer: " + directBuf.toString(io.netty.util.CharsetUtil.UTF_8));
directBuf.release();
// 使用非池化分配器
ByteBufAllocator unpooledAllocator = UnpooledByteBufAllocator.DEFAULT;
// 分配一个堆内存 ByteBuf
ByteBuf heapBufUnpooled = unpooledAllocator.heapBuffer(1024);
heapBufUnpooled.writeBytes("Hello, Unpooled Heap Buffer!".getBytes());
System.out.println("Unpooled Heap Buffer: " + heapBufUnpooled.toString(io.netty.util.CharsetUtil.UTF_8));
heapBufUnpooled.release();
// 分配一个直接内存 ByteBuf
ByteBuf directBufUnpooled = unpooledAllocator.directBuffer(1024);
directBufUnpooled.writeBytes("Hello, Unpooled Direct Buffer!".getBytes());
System.out.println("Unpooled Direct Buffer: " + directBufUnpooled.toString(io.netty.util.CharsetUtil.UTF_8));
directBufUnpooled.release();
}
}
总结
要不要使用缓冲池,使用直接内存还是Java堆都要看具体业务,在IO场景Netty 内部优先使用直接内存;频繁的IO操作推荐使用缓冲池分配,避免内存频繁创建和销毁带来的开销。
热门推荐
腰骶神经根损伤与腓总神经损伤有何差异
从大同古城到中国院子:一座城的“活化之路”
周杰伦演唱会预计吸引十万歌迷来榕 商家“蹭热出招”带旺文旅消费
缴纳房产税有哪些需要注意的事项?房产税如何征收?
小空间也能大变样:精心打造舒适高效的办公环境秘诀
国产ERT/ECT工业电阻/电容层析成像系统在多相流领域的应用
2025年《世界肥胖报告》发布!中国41%人群体重超标,两大策略助力有效减肥
汽车腐蚀危害巨大 耐腐蚀研发与防护需加强
电脑之故障检测(Computer Fault Detection)
怎么把Excel多人编辑汇总在一起
就性价比而言,软硬解码那个更适用于个体?
鸭肉的功效与作用及食用禁忌
如何评估纸黄金和纸白银的趋势情况?这种趋势情况受哪些宏观因素影响?
五台山旅游攻略一日游:探寻佛教圣地,一日尽览精华
如何依法处理遗产的相关事宜?处理遗产时如何保障各方权益?
运动出汗是否对湿疹患者有益
会喝陈皮水,睡觉很简单,陈皮这样搭配煮水喝,睡觉越来越安稳!
欧洲心脏病学会发布最新共识:肥胖与心血管疾病的关联及临床管理策略
圆的面积怎么算 计算方法是什么
DirectX 版本怎么看?教你快速查看电脑DirectX版本的方法
古风名字那么多,怎样才能选出最好听的
孕妇可以吃烤红薯吗
试用期不给买社保可以仲裁吗
运动后吃什么食物最好?恢复体力,加速肌肉修复!
装修必备的十类柜子:功能与设计全解析
《天道》揭露的5层人性真相:95%的人活在第一层,你在哪一层?
“现实版二次元拯救世界”:郑州大上海城的绝处逢生
Nim编程语言入门:特性、应用场景与未来趋势
什么是ST股票的特征和定义?这类股票的市场表现有哪些特点?
孕妇吃红薯有哪些好处呢