Netty 的 ByteBuf 设计?
Netty 面试题发布于
一、与 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,否则内存泄漏。