Netty Unpooled 内存分配

本文详细探讨了Netty中UnpooledByteBufAllocator如何分配heap和direct内存,解析了Unsafe与非Unsafe类型在内存操作上的差异,帮助读者深入理解Netty的内存管理机制。

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

Netty里的内存管理是通过ByteBuf这个类作为桥梁连接着业务代码与jdk底层的内存。所以理解ByteBuf的结构就很有必要了。

ByteBuf

ByteBuf的内部结构如下图:
5796101-19fe73a41485518b.png

这里通过两个指针,readerIndex与writerIndex分别指向已经读到的位置和写入的位置,比JDK提供的ByteBuffer 省了flip操作。类结构如图所示:
5796101-157ef86c4576f762.png
ByteBuf类结构图
ByteBuf分类
  • Pooled和Unpooled:pooled类型的bytebuf是在已经申请好的内存块取一块内存,而Unpooled是直接通过JDK底层代码申请。
  • Unsafe和非Unsafe:这里的Unsafe是JDK底层的对象,通过它能够直接操作到内存。
  • Heap和Direct:一个是在堆上分配,一个是直接内存。Direct不受GC的控制。
ByteBufAllocator

ByteBuf对象是通过ByteBufAllocator来进行生成的,其中AbstractByteBufAllocator里实现在大部分的功能,具体是pooled还是unpooled类型的byteBuf是留给相应的子类来实现的,而Heap和Direct是通过暴露不同的接口来区分的,Unsafe与非Unsafe是通过JDK内部的平台来进行判断是否能生成Unsafe类的ByteBuf。ByteBufAllocator类图如下:
5796101-8a52c4f63ea6659a.png
ByteBufAllocator类图
UnpooledByteBufAllocator分配heap内存
  • 通过调用heapBuffer方法分配一块heap内存
    5796101-e16d8879e6d663eb.png
    AbstractByteBufAllocator的heapBuffer方法
  • 根据平台是否支持unsafe操作,生成不同的对象
    5796101-06b8378e4310925b.png
  • unsafe类的构造过程
    5796101-e8a7216441ad95a9.png
    5796101-e877c956dca458b3.png
    5796101-53d68e42400cf713.png
  • 非unsafe类型的直接调用new byte[]构造
    5796101-9f795140ad6e91b3.png
  • unsafe类型的byteBuf申请内存对象
    5796101-0d3bcfdaebe572af.png
    5796101-237d6684009a5165.png
    5796101-ed78e40be63bcc9d.png
    5796101-956681f1acd1f7ea.png
Unsafe与非Unsafe类型的byteBuf内部实现上的差异
  • 非unsafe的getByte方法
    5796101-f33c3a8ffd7ce28f.png
    5796101-acc322838ae206c4.png
  • unsafe的getByte方法
    5796101-ab49ac65c7029dd9.png

    5796101-e6c0f85b24bc71d5.png
    5796101-a15edbd5a34cd58e.png
    image.png
    5796101-61a798104c6b6453.png
UnpooledByteBufAllocator分配direct内存
  • UnpooledByteBufAllocator类的newDirectBuffer方法
    5796101-bab589eb0d75cd8a.png
  • UnpooledUnsafeDirectByteBuf创建流程
    5796101-ea5a27d723511fb3.png
    5796101-2e45eadafccc7b68.png
    5796101-76802cb9f021bf40.png
    5796101-2435c5fe71791b81.png
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值