【问题标题】:Small block allocator on Linux (or RedHat Linux) to avoid memory fragmentationLinux(或 RedHat Linux)上的小块分配器,以避免内存碎片
【发布时间】:2010-03-10 08:16:13
【问题描述】:

我知道在 HP-UX link text 和 Windows XP Low-fragmentation Heap 上,有一个用户应用程序分配器可以处理大量小块分配。在 HP-UX 上,可以调整分配器,在 Windows XP 上,它认为小于 16 K 的块很小。

我的问题是我找不到任何关于这种用于在 Linux(实际上是 RedHat Linux)上运行的用户程序的分配器的信息。如果有这样的分配器,我实际上想知道它可以处理的最大块大小。


更新
我找到了 jemalloc (http://www.canonware.com/jemalloc/)。它处理小型、大型和巨大的块:http://www.canonware.com/download/jemalloc/jemalloc-latest/doc/jemalloc.html#size_classes

【问题讨论】:

    标签: c++ linux memory-management


    【解决方案1】:

    Redhat Linux 或任何基于 Linux 的发行版大多使用 DL-Malloc (http://gee.cs.oswego.edu/dl/html/malloc.html)。

    对于 Kirill 指出的用户应用程序,如果由于更小的块而导致更多碎片,则最好使用单独的内存分配器。

    如果用户应用程序很小,您可以尝试使用 C++ 放置 new/delete,它可以覆盖默认的分配器模式。 (http://en.wikipedia.org/wiki/Placement_syntax)

    【讨论】:

      【解决方案2】:

      作为独立于平台的解决方案,请尝试 Boost.Pool 库。它具有pool 接口,可以处理任何大小的块。您也可以使用满足标准分配器要求的pool_alloc

      作为特定于平台的解决方案,您可以尝试 glibc 库中的 mallopt 函数。但据我所知,它对小块没有帮助。

      【讨论】:

        【解决方案3】:

        它是一个通用分配器,但 Hoard heap 声称具有“严格的碎片限制”[1]

        超级块中的所有块大小相同 班级。通过使用大小等级是 b 的幂(其中 b 大于 1) 并将请求的大小四舍五入到最接近的大小类,我们将最坏情况的内部碎片限制在 一个块到一个因子b。为了减少外部碎片, 我们回收完全空的超级块以供任何大小的重复使用 类。

        不知道是否有帮助,但尝试一下很容易。

        【讨论】:

        • 它不是默认分配器,但在使用 Hoard 分配器测试我的应用程序后,我发现它消耗的内存减少了 17%,运行速度更快。谢谢!
        【解决方案4】:

        TCMalloc:Thread-Caching Malloc

        已经找到了一个很好的替代默认 Linux 分配器的方法。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-03-28
          • 2012-06-12
          • 2011-06-10
          • 2011-01-05
          • 1970-01-01
          • 2014-07-14
          • 2016-10-15
          相关资源
          最近更新 更多