Linux(或RedHat Linux)上的小块分配器可避免内存碎片

我知道在用户应用程序中有一个分配器,而不是在HP-UX 链接文本和Windows XP 低碎片堆上处理大量的小块分配。 在HP-UX上,可以调整分配器,在Windows XP上它认为小于16 K的块的大小很小。

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


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

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

对于Kirill指出的用户应用程序,如果碎片更多是因为块较小,最好使用单独的内存分配器。

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

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

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

这是一个通用的分配器,但是Hoard堆声称有“严格的分裂” [1] :

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

不知道是否有帮助,但很容易就可以试用。

TCMalloc:线程缓存Malloc

默认的Linux分配器已经找到了一个很好的选择。