【netty学习笔记十一】JEMalloc介绍

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用双向链表管理起来。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容