ByteBuf 内存问题

NIO中的ByteBuf支持池化操作,包括直接内存和堆内存两种类型。直接内存读写效率高,无GC管理但需手动释放,而堆内存在JVM管理下,连续性好。ByteBuf由写指针、读指针、容量和最大容量组成,释放遵循引用计数,slice操作后需用retain增加引用计数来避免错误释放。
摘要由CSDN通过智能技术生成

Netty的ByteBuf和NIO的ByteBuffer,支持池化操作。提供了两种类型的内存:

一、直接内存。

ByteBufAllocator.DEFAULT.directBuffer()

        ①直接内存读写效率非常高,少了一次内存复制。

        ②直接内存少了GC的管理,对JVM GC压力小。

        ③由于直接使用的系统的内存,因此内存分散,连续性差。

        ④GC不管理内存,因此要自己手动释放。

二、堆内存

        使用:ByteBufAllocator.DEFAULT.heapBuffer()创建堆内存

        JVM从内存中划出的一部分内存,连续性好。

三、组成部分:

  byteBuf,由四部分组成:

  ①写指针②读指针③容量④最大容量

因此分为:

      扩容部分内存、可写部分、可读部分,废弃部分

四、释放问题

        直接内存遵循:谁最后用,谁释放relase,释放算法为引用计数。

扩展:

         如果对原有bytebuf进行了slice() 操作。这时候再调用release会释放原来的内存;解决方案可以是:        

retain() :重新给引用计数+1
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值