Netty的ByteBuf和NIO的ByteBuffer,支持池化操作。提供了两种类型的内存:
一、直接内存。
ByteBufAllocator.DEFAULT.directBuffer()
①直接内存读写效率非常高,少了一次内存复制。
②直接内存少了GC的管理,对JVM GC压力小。
③由于直接使用的系统的内存,因此内存分散,连续性差。
④GC不管理内存,因此要自己手动释放。
二、堆内存
使用:ByteBufAllocator.DEFAULT.heapBuffer()创建堆内存
JVM从内存中划出的一部分内存,连续性好。
三、组成部分:
byteBuf,由四部分组成:
①写指针②读指针③容量④最大容量
因此分为:
扩容部分内存、可写部分、可读部分,废弃部分
四、释放问题
直接内存遵循:谁最后用,谁释放relase,释放算法为引用计数。
扩展:
如果对原有bytebuf进行了slice() 操作。这时候再调用release会释放原来的内存;解决方案可以是:
retain() :重新给引用计数+1