JEMalloc分配算法
netty的內(nèi)存分配原理和jemalloc大體一致,jemalloc原理可以看:https://people.freebsd.org/~jasone/jemalloc/bsdcan2006/jemalloc.pdf
netty會(huì)將申請(qǐng)的內(nèi)存分tiny/small、normal、huge:

當(dāng)有申請(qǐng)內(nèi)存請(qǐng)求過(guò)來(lái)時(shí),就像京東購(gòu)物一樣,如果是小件物品,直接從同城倉(cāng)庫(kù)送;如果是大件物品,從區(qū)域倉(cāng)庫(kù)送;如果是
超大件,則從全國(guó)倉(cāng)庫(kù)送出。而對(duì)于netty來(lái)說(shuō),有點(diǎn)不一樣的是不管是多大內(nèi)存,首先從緩存中找(PoolThreadCache),沒(méi)有的話則從區(qū)域(PoolArena)中找。
Arena
為了提高內(nèi)存分配效率和減小內(nèi)存碎片,Arena會(huì)切分成Chunk,根據(jù)Chunk的內(nèi)存使用率又分為幾種狀態(tài):QINIT,Q0,Q25,Q50,Q75,Q100。每個(gè)狀態(tài)是一個(gè)雙向鏈表,不同狀態(tài)間也是雙向鏈表維護(hù)。chunk可以自由從各種狀態(tài)間切換嗎。
Chunk
Chunk比較大,默認(rèn)為16MB,因此又將Chunk分為2048個(gè)Page,每個(gè)Page為8KB。并用12層的滿二叉樹來(lái)管理,每個(gè)葉子節(jié)點(diǎn)一個(gè)page。每個(gè)父節(jié)點(diǎn)記錄子節(jié)點(diǎn)內(nèi)存分配情況。這種分配方式即是伙伴算法。
SubPage
一個(gè)Page為8KB還是比較大,為了應(yīng)對(duì)較小的內(nèi)存申請(qǐng)需求,如16B、32B這種,Page又分為更小的SubPage,SubPage為最小分配單位。但切分的單位不固定,以第一次請(qǐng)求分配的大小為單位。如第一次請(qǐng)求為32B(如果請(qǐng)求為30B,會(huì)向上找最近的一個(gè)2的n次方的值),則將page按32B分為512塊。同時(shí)arena會(huì)將不同subpage用雙向鏈表管理起來(lái)。