jemalloc 简记

jemalloc 的资料比 ptmalloc 和 tcmalloc 少许多, 没有找到写得比较好的. 这里也只随便记一记了.
不同于 ptmalloc/tcmalloc 将内存分配分为 2 类: small/big(分别以128/256K分界), jemalloc 将内存分配分为 3 类:

  • small class: Byte 级别, 不超过 1 页.
  • large class: 页级别, 不超过 4MB (jemalloc 中的 1 个 chunk 大小).
  • huge class: 大于 4MB 的超大内存.
    3 种内存各采取不同的策略.

jemalloc 设计

jemalloc 使用 chunk/arena/bin/run 的概念来组织内存:

  • chunk: 用于分配的内存块, 默认是 4MB, 每个 chunk 的前几页存储 chunk 的分配情况(header), 后面的页则用于实际分配.
  • run: chunk 分配出去的一个区域, 大小是 page 的整数倍, 可以认为 chunk=header+run+run+run... run=header+block+block+block... 其中 block 就是实际分配给用户的内存块
  • bin: 和 ptmalloc 中的 bin 相似, 管着同一大小的一系列 block, 但实际分配是通过 run 来进行的, 可以认为 bin 管着一堆 run, 然后通过这堆 run 间接管着一堆 block.
  • arena: 和 ptmalloc 中的 arena 比较类似, 每个 arena 都有自己的一堆 chunk.
  • tcache: 和 tcmalloc 中的 ThreadCache 比较类似, 每个线程有一个私有的缓存, 用来存一些小的可用 block.
    各种类型的内存分配策略如下:
  • small class: tcache bin -> arena bin -> syscall
  • large class: arena bin -> syscall
  • huge class: mmap

特别值得一提的是, jemalloc 的 bin 里面用一个红黑树管着各个 run, 按地址排序, 每次分配时优先使用低地址的 run, 这能够有效地减少内存碎片, 是 jemalloc 相比起 tcmalloc 的一大优点.
同时, jemalloc 在借鉴 ptmalloc 引入互相隔离的 arena 同时, 也设计了减少锁抢占的 thread-cache, 多核场景下的表现会比 tcmalloc 更好.
另外, jemalloc 具备以 chunk 为单位归还内存给系统的能力, tcmalloc 设计上对于归还内存的行为相对保守, 同时 large-span 可能因为拆分导致内存碎片出现迟迟无法归还的现象(前几天刚碰上).

posted @   erenn  阅读(258)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
点击右上角即可分享
微信分享提示