Netty 的 ByteBuf 设计?

发布于

一、与 ByteBuffer 对比

  • JDK ByteBuffer 只有一个 position,读写切换需 flip(),易出错。
  • ByteBuf 有 readerIndex 和 writerIndex 两个指针,读写分离,无需 flip。

二、核心方法

  • readXxx() / writeXxx():读写并移动指针。
  • getXxx() / setXxx():读写不移动指针。
  • discardReadBytes():丢弃已读数据,腾出空间。
  • markReaderIndex() / resetReaderIndex():标记重置。

三、内存管理

  • 池化:PooledByteBufAllocator,复用内存,减少 GC。
  • 堆内/堆外:heap buffer(JVM 堆)/ direct buffer(堆外,零拷贝)。
  • 引用计数:基于 ReferenceCounted,release() 释放。

四、零拷贝

  • CompositeByteBuf:组合多个 ByteBuf,无需拷贝合并。
  • wrap / slice:共享底层内存。
  • FileRegion:文件传输零拷贝。

五、建议

  • 生产用 PooledByteBufAllocator。
  • 申请的 ByteBuf 必须 release,否则内存泄漏。