PooledByteBuf
前面介绍了一大堆内存管理,对象池的东西,就是为了讲这个,现在再去理解容易多了。
跟前面的UnpooledHeapByteBuf
类似的继承结构,也是继承引用计数的。
主要属性
下面的属性基本上都讲到过了。
recyclerHandle
,用于对象池的回收。chunk
,表示分配在哪个块上。handle
,表示在块上分配的偏移地址。memory
,具体内存形式,堆内就是字节数组,对外就是DirectByteBuffer
。offset
,避免缓存行出现假共享。length
,请求的内存大小。maxLength
,规范后的内存大小,最大能用的空间cache
,线程本地缓存,优先从缓存获取可用的块和句柄信息
其他就是实现了一些常规的字节缓冲区方法,我就不多介绍了,可用自己去看看。
PooledHeapByteBuf
是上面的子类,作为具体的缓冲区实例。
这个类会有一个对象池:
通过这个静态方法获取对象:
获得之后重新设置属性即可:
PooledDirectByteBuf
这个也类似:
对于他来说,这些方法是不支持的,因为他是在堆外的,只有地址,他的memory
是直接缓冲区DirectByteBuffer
,所有操作都是根据:
PooledUnsafeDirectByteBuf
跟上面类似,只是用了unsafe
获取直接缓冲区在堆外的地址memoryAddress
,所有的操作几乎都用UnsafeByteBufUtil
来操作地址偏移来完成。比如:
最后就是JNI
的方法:
PooledUnsafeHeapByteBuf
也是类似的,很多操作都在JNI
里进行了。
至此池化的缓冲区基本上都介绍完了,主要还对象池,回收器,内存分配三大块。
ThreadLocalDirectByteBuf
还有一个可以池化的也补充下吧,这个是在ByteBufUtil
内部的,是也是有对象池的,但是是UnpooledDirectByteBuf
子类。
释放的时候可以根据参数设定,是直接释放了,还是放入对象池。
ThreadLocalUnsafeDirectByteBuf
类似的原理,也不多说了。
好了,今天就到这里了,希望对学习理解有帮助,大神看见勿喷,仅为自己的学习理解,能力有限,请多包涵。