1. 程式人生 > >Netty原始碼解析 -- PoolSubpage實現原理

Netty原始碼解析 -- PoolSubpage實現原理

前面文章說了PoolChunk如何管理Normal記憶體塊,本文分享PoolSubpage如何管理Small記憶體塊。 **原始碼分析基於Netty 4.1.52** #### 記憶體管理演算法 PoolSubpage負責管理Small記憶體塊。一個PoolSubpage中的記憶體塊size都相同,該size對應SizeClasses#sizeClasses表格的一個索引index。 新建立的PoolSubpage都必須加入到PoolArena#smallSubpagePools[index]連結串列中。 PoolArena#smallSubpagePools是一個PoolSubpage陣列,陣列中每個元素都是一個PoolSubpage連結串列,PoolSubpage之間可以通過next,prev組成連結串列。 感興趣的同學可以參考《記憶體對齊類SizeClasses》。 注意,Small記憶體size並不一定小於pageSize(預設為8K) 預設Small記憶體size <= 28672(28KB) 關於Normal記憶體塊,Small記憶體塊,pageSize,可參考《PoolChunk實現原理》。 PoolSubpage實際上就是PoolChunk中的一個Normal記憶體塊,大小為其管理的記憶體塊size與pageSize最小公倍數。 PoolSubpage使用點陣圖的方式管理記憶體塊。 PoolSubpage#bitmap是一個long陣列,其中每個long元素上每個bit位都可以代表一個記憶體塊是否使用。 #### 記憶體分配 分配Small記憶體塊有兩個步驟 1. PoolChunk中分配PoolSubpage。 如果PoolArena#smallSubpagePools中已經有對應的PoolSubpage緩衝,則不需要該步驟。 2. PoolSubpage上分配記憶體塊 PoolChunk#allocateSubpage ``` private long allocateSubpage(int sizeIdx) { // #1 Poo