關(guān)鍵數(shù)據(jù)結(jié)構(gòu)
對照上圖巡揍,我們看一下相關(guān)數(shù)據(jù)結(jié)構(gòu)
PooledArena
代表內(nèi)存中一塊連續(xù)區(qū)域牡属,其內(nèi)部有2個重要的數(shù)據(jù)結(jié)構(gòu)
-
tinySubpagePools/smallSubpagePools
小于8KB的內(nèi)存申請隐解,優(yōu)先從tinySubpagePools/smallSubpagePools數(shù)組中申請內(nèi)存隔崎。
如果subPages數(shù)組為空,則從PoolChunk申請內(nèi)存走诞。
-
PoolChunkList
PooledArena按內(nèi)存使用率的不同摔笤,將PoolChunk分成了6個List够滑。
比如q025這個PoolChunkList里面的PoolChunk的內(nèi)存使用率都在25%(不一定很精確)
PoolChunk
負(fù)責(zé)管理一塊16MB的內(nèi)存區(qū)域
-
以下兩種場景,直接從PoolChunk中申請內(nèi)存
- 申請內(nèi)存大于8KB小于16MB時
- 申請內(nèi)存小于8KB吕世,但是tinySubpagePools/smallSubpagePools為空時
-
PoolChunk的選擇策略
優(yōu)先從內(nèi)存使用率小的PoolChunkList中彰触,挑選PoolChunk進(jìn)行內(nèi)存分配。
-
監(jiān)控PoolChunk的內(nèi)存使用率
比如:線程從內(nèi)存使用率50%的PoolChunkList挑選了一個PoolChunk
分配內(nèi)存后PoolChunk的內(nèi)存使用率超過了75%
則將此PoolChunk遷移到內(nèi)存使用率為75%的PoolChunkList中
-
PoolSubpage
負(fù)責(zé)管理從PoolChunk申請的小于8KB的內(nèi)存區(qū)域
內(nèi)存分配的套路
-
我們可以將PoolChunk看成”內(nèi)存生產(chǎn)商“寞冯,有2條產(chǎn)品線
tiny/small :負(fù)責(zé)生成8KB以內(nèi)的內(nèi)存
normal:負(fù)責(zé)生產(chǎn)8KB到16MB之間固定容量的內(nèi)存(16MB,8MB,4MB,2MB……16KB,8KB)
-
將tinySubpagePools/smallSubpagePools 看成“二手寄賣商店”渴析,負(fù)責(zé)售賣小于8KB的內(nèi)存
- tinySubpagePools負(fù)責(zé)售賣小于512Byte的內(nèi)存
- smallSubpagePools負(fù)責(zé)售賣大于512Byte小于等于8KB的內(nèi)存
將線程看成購買內(nèi)存的客戶,買tiny/small產(chǎn)品的是小客戶吮龄,買normal產(chǎn)品的是大客戶
大客戶比較有錢,不會購買8KB一下的內(nèi)存,我們主要關(guān)注一下小客戶的艱辛
由于PoolChunk廠商最小規(guī)格的內(nèi)存是8KB咆疗,如果小客戶要買1KB的內(nèi)存漓帚,會優(yōu)先在“二手寄賣商店”購買
如果商店沒貨,則在PoolChunk廠商購買8KB內(nèi)存午磁,然后將剩余的7KB內(nèi)存掛在“二手寄賣商店”