JEMalloc分配算法
netty的内存分配原理和jemalloc大体一致,jemalloc原理可以看:https://people.freebsd.org/~jasone/jemalloc/bsdcan2006/jemalloc.pdf
netty会将申请的内存分tiny/small、normal、huge:

image.png
当有申请内存请求过来时,就像京东购物一样,如果是小件物品,直接从同城仓库送;如果是大件物品,从区域仓库送;如果是
超大件,则从全国仓库送出。而对于netty来说,有点不一样的是不管是多大内存,首先从缓存中找(PoolThreadCache),没有的话则从区域(PoolArena)中找。
Arena
为了提高内存分配效率和减小内存碎片,Arena会切分成Chunk,根据Chunk的内存使用率又分为几种状态:QINIT,Q0,Q25,Q50,Q75,Q100。每个状态是一个双向链表,不同状态间也是双向链表维护。chunk可以自由从各种状态间切换吗。
Chunk
Chunk比较大,默认为16MB,因此又将Chunk分为2048个Page,每个Page为8KB。并用12层的满二叉树来管理,每个叶子节点一个page。每个父节点记录子节点内存分配情况。这种分配方式即是伙伴算法。
SubPage
一个Page为8KB还是比较大,为了应对较小的内存申请需求,如16B、32B这种,Page又分为更小的SubPage,SubPage为最小分配单位。但切分的单位不固定,以第一次请求分配的大小为单位。如第一次请求为32B(如果请求为30B,会向上找最近的一个2的n次方的值),则将page按32B分为512块。同时arena会将不同subpage用双向链表管理起来。