tcmalloc/jemalloc和内存池之间的区别是什么

Mic*_*ine 52 c linux memory malloc tcmalloc

tcmalloc/jemalloc是改进的内存分配器,并且还引入了内存池以实现更好的内存分配.那么它们之间有什么区别以及如何在我的应用程序中选择它们呢?

Pav*_*ath 80

这个博客链接到所有流行的mallocs的详细描述.

这篇文章引用了一个关键的区别beween tcmallocjemalloc并建议该选.

这篇文章完整地描述背后的算法jemalloc


小智 7

这取决于您的程序的要求。如果您的程序有更多的动态内存分配,那么您需要从可用的分配器中选择一个内存分配器,这将为您的程序产生最佳性能。

为了良好的内存管理,您至少需要满足以下要求:

  1. 检查您的系统是否有足够的内存来处理数据。
  2. 您是否可以从可用内存中进行分配?
  3. 将已使用的内存/已释放的内存返回到池(程序或操作系统)

一个好的内存管理器的能力可以根据(至少)其检索/分配和返回/解除分配内存的效率来测试。(还有更多条件,例如缓存局部性、管理开销、VM 环境、小型或大型环境、线程环境等。)

关于tcmalloc和jemalloc有很多人做过比较。参考其中一项比较:

http://ithare.com/testing-memory-allocators-ptmalloc2-tcmalloc-hoard-jemalloc-while-trying-to-simulate-real-world-loads/

如果线程数较少,则 tcmalloc 在每次分配的 CPU 周期方面得分高于所有其他。jemalloc 与 tcmalloc 非常接近,但比 ptmalloc (std glibc 实现)更好。

就内存开销而言jemalloc最好,其次是ptmalloc,其次是tcmalloc。

总的来说,可以说 jemalloc 的得分高于其他。您还可以在这里阅读有关 jemalloc 的更多信息:

https://www.facebook.com/notes/facebook-engineering/scalable-memory-allocation-using-jemalloc/480222803919

我只是引用了其他人完成和发布的测试,并没有亲自测试过。我希望这对您来说是一个很好的起点,并用它来测试和选择最适合您的应用程序。


zan*_*ngw 7

文档的摘要

\n
    \n
  • tcmalloc

    \n

    tcmalloc 是 Google 开源的内存管理库,作为 glibc malloc 的替代品。已在chrome、safari等知名软件中使用。根据官方测试报告,ptmalloc 在 2.8GHz P4 机器上(对于小对象)执行 malloc 和 free 大约需要 300 纳秒。TCMalloc 版本执行相同操作大约需要 50 纳秒。

    \n
      \n
    • 小对象分配\n
        \n
      • tcmalloc 为每个线程分配一个线程本地ThreadCache。小内存是从 ThreadCache 中分配的。另外,还有一个中央堆(CentralCache)。当ThreadCache不够用时,就会从CentralCache中获取空间,放入ThreadCache中。
      • \n
      • 小对象(<=32K)从ThreadCache分配,大对象从CentralCache分配。大对象分配的空间按照4k页对齐,多个页也可以切分成多个小对象,划分到ThreadCache中
      • \n
      \n
    • \n
    • CentralCache 分配管理\n
        \n
      • 大对象(>32K)首先与4k对齐,然后从CentralCache分配。
      • \n
      • 当最适合的页面链表中没有空闲空间时,页面空间总是更大。如果256个链表都遍历完了,分配还是不成功。使用sbrk、mmap、/dev/mem从系统分配。
      • \n
      • tcmalloc PageHeap 管理的连续页称为span。如果没有分配span,则span是PageHeap中的一个链表元素。
      • \n
      \n
    • \n
    • 回收\n
        \n
      • 当一个对象空闲时,根据地址对齐计算页码,然后通过central数组找到对应的span。
      • \n
      • 如果是小对象,span会告诉我们它的大小类别,然后将该对象插入到当前线程的ThreadCache中。如果此时ThreadCache超过了一个预算值(默认2MB),就会使用垃圾收集机制将未使用的对象从ThreadCache移动到CentralCache的中央空闲列表中。
      • \n
      • 如果是大对象,span会告诉我们该对象被锁定的页码范围。假设这个范围是[p,q],首先搜索页面p-1和q+1所在的span。如果这些相邻的span也空闲,则将它们合并到[p,q]所在的span中,然后将这个span回收到PageHeap。
      • \n
      • CentralCache的中央空闲列表与ThreadCache的FreeList类似,但增加了一级结构。\n在此输入图像描述
      • \n
      \n
    • \n
    • TEMERAIRE是 TCMalloc 的增强功能,专门设计用于感知大页。\n
        \n
      • 此增强功能通过优化大页覆盖、减少碎片和增强整体应用程序性能,满足了大型数据中心改进内存分配的需求。
      • \n
      \n
    • \n
    \n
  • \n
  • 杰马洛克

    \n

    jemalloc由facebook推出,最早由freebsd的libc malloc实现。目前广泛应用于firefox和facebook服务器的各个组件中。

    \n
      \n
    • 内存管理\n
        \n
      • 与tcmalloc类似,每个线程在小于32KB时也使用无锁的线程本地缓存。
      • \n
      • Jemalloc 在 64 位系统上使用以下大小类别分类: Small: [8], [16, 32, 48, \xe2\x80\xa6, 128], [192, 256, 320, \xe2\x80\xa6, 512 ], [768, 1024, 1280, \xe2\x80\xa6, 3840]\n大: [4 KiB, 8 KiB, 12 KiB, \xe2\x80\xa6, 4072 KiB]\n巨大: [4 MiB, 8 MiB , 12 MiB, \xe2\x80\xa6]
      • \n
      • 小/大对象需要恒定的时间来查找元数据,而大对象通过全局红黑树以对数时间搜索。
      • \n
      • 虚拟内存在逻辑上分为块(默认为4MB,1024个4k页),应用程序线程通过循环算法在第一次malloc时分配arena。每个 arena 都是相互独立的,并维护自己的块。块将页面切割成小/大对象。free() 的内存总是返回到它所属的 arena,无论哪个线程调用 free()。\n在此输入图像描述
      • \n
      \n
    • \n
    \n
  • \n
  • 比较

    \n
      \n
    • jemalloc最大的优势就是强大的多核/多线程分配能力。CPU的核心越多,程序线程就越多,jemalloc分配的速度就越快
    • \n
    • 当分配大量小内存时,jemalloc记录元数据的空间会比tcmalloc略多。
    • \n
    • 当分配大内存时,内存碎片也会比 tcmalloc 少。
    • \n
    • Jemalloc对内存分配粒度进行了更精细的分类,它比ptmalloc导致更少的锁争用。
    • \n
    • TEMERAIRE 增强功能在高性能内存分配至关重要的场景中非常有用,并且针对大页进行优化可以在大规模环境中显着提高效率
    • \n
    \n
  • \n
\n