70

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

4

2 回答 2

4

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

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

  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

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

于 2020-03-03T03:59:53.057 回答
0

此文档的摘要

  • tcmalloc

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

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

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

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

    • jemalloc最大的优势在于其强大的多核/多线程分配能力。CPU的核数越多,程序线程越多,jemalloc分配的速度越快
    • 在分配大量小内存时,jemalloc 记录元数据的空间会比 tcmalloc 略多。
    • 在分配大内存分配时,内存碎片也会比 tcmalloc 少。
    • Jemalloc 对内存分配粒度的分类更精细,与 ptmalloc 相比,它导致的锁争用更少。
于 2022-01-11T06:00:27.610 回答