netty缓存分配与对象池重用机制
2021-09-10 17:35:10 0 举报
netty缓存分配与对象池重用机制
作者其他创作
大纲/内容
1.release尝试放入缓存队列
queue 32B(512)
0
左右子节点值不相等,取最小值1
ByteBuf6KB字节
左右子节点比较取小值2
释放改为层级2
8K以下到PoolSubpage分配
queue 16B(512)
PoolChunkList-q075这里的Chunk使用率75-100%
层架2与左子节点值1比对,大于1查找左子节点
2
被占用值改为12
PoolChunkList-q100这里的Chunk使用率100-无限
newDirectBuffer
next
MemoryRegionCache[2]
4.命中缓存:回收Entry
2.allocate分配ByteBuf内存空间(堆外)按容量6K找到缓存元素
Entry
PoolSubpage[]-small 4个
1
UnPooledByteBufAllocator
被占用值改为12,为啥12因为层高11
small-SubPageMemoryRegionCache[4] 每个元素为队列并存放Entry(包装了不同容量的ByteBuf,依次为512B-1KB-2KB-4KB)
PoolThreadCache(工作线程的上下文Thread.InternalThreadLocalMap.indexedVariables[i])
11
subpages[2048]存放切分的page
12
Page1116K-24K
左右子节点比较取小值1
PoolChunk
MemoryRegionCache[0]
层级2与左子节点值2比对相等+层级相同,占用
Page 11->120-8K
PoolChunkList-q000这里的Chunk使用率1-50%
Page 10-8M
Page118-16K
byte[]
PoolChunkList-q025这里的Chunk使用率25-75%
PooledByteBufAllocator(含有cpu核数*2个PoolArena)
queue 2KB(256)
normal-NormalMemoryRegionCache[3]每个元素为队列并存放Entry(包装了不同容量的ByteBuf,依次为8KB-16KB-32KB)
2.不能回收到缓存,那么释放空间
1.重置并返回
3.未命中缓存:以numThreadCaches最小找到最少使用的arena
Chunk可使用的空间由JVM NIO DirectByteBuffer(16MB)创建,并按8K划分2048个区域的平衡二叉树,以提高查找可用空间效率遍历N->logN(缺点:内存利用不充分有碎片,进一步将page划分相同大小的tiny/small以减少碎片),使用树加快查找空闲节点chunk在整个DirectByteBuffer的位置:offset
Page1016K-32K
ByteBuf在这个空间内读写数据,并设置12(表示该节点已使用)
MemoryRegionCache[1]
Recycler
PoolSubpage2K
MemoryRegionCache[3]
ByteBuf
4.未找到chunk时:newChunk
层级2小于左节点值12,说明分配不下
PoolChunkList-q050这里的Chunk使用率50-100%
Page 28-12M
queue 32KB(64)
Page 24-8M
head
Page 18-16M
10
Subpage记录Page拆分与使用情况
Page100-16K
allocate
Page 20-4M
queue 16KB(64)
netty需要频繁读取和写出数据包,产生大量ByteBuf,设计对象池
queue 512B(256个)
Page 00-16M
null
1.get
超过16MB
创建新的ByteBuffer且不会重用
8K以上:遍历Chunk链表中的每个Chunk尝试分配空间
内存分配
左右子节点相同就写原层级1
Page1124K-32K
PoolSubpage1K
ByteBufAllocator
PoolSubpage[]-tiny 32个
3.清除标记chunk和handle
5.按bytebuf容量计算树的位置,并查找可用空间
与左子节点值2比对相同但大于所属层级1说明子节点有空间查找子节点
DirectByteBuffer
左右子节点值不相等,取最小值2
queue 8KB(64个)
Page 212-16M
3.命中缓存:将缓存元素Entry的chunk和handle赋值给bytebuf
Stack
PoolSubpage位置:offset
PoolChunkList-qInit这里的Chunk使用率0-25%
PoolSubpage4K
queue 1KB(256)
tiny-SubPageMemoryRegionCache[32] 每个元素为队列并存放Entry(包装了不同容量的ByteBuf,依次为0B-16B-32B-48B-。。-496B)
PoolArena管理Chunk(分堆内存Arena,堆外即直接内存Arena)缓存numThreadCaches存放使用本缓存的线程数目,每分配一次该值+1共6个PoolChunkList:q050(50-100)-q025(25-70)-q000(1-50)-qinit-q075(75-100)-q100(>100)
Chunk链表
4.回收recycle
层级2与右子节点值2比对相同+层级相同,占用
PoolSubpage512B
queue 4KB(256)
queue 0B(512个)
6.关联实际的内存空间chunk+handle,handle其实就是ByteBuffer首地址的偏移量
PoolSubpage
0 条评论
下一页