我有一个问题,一直困扰着我上周。Linux堆碎片
在Windows调试存在!heap -s
命令输出该虚拟存储器的堆状态,并使用下列公式计算所述外部碎片:
External fragmentation = 1 - (larget free block/total free size)
是否有在Linux的相似方法,其输出以计算所需要的那些统计效果如何?
长篇大论现在: 我有一个C应用程序,它使用malloc和free来保持不同大小的空间的分配和释放,每个分配的寿命不同。 我使用的平台是Lubuntu,所以ptmalloc2
算法是默认的。
我知道这些分配是在虚拟用户空间堆(除了那些大于128Kb,分配器使用mmap
),并在实际访问时映射到物理页面。 大部分分配的大小为< 80字节,所以它们来自FastBins。
使用Valgrind
和Massif
我可以得到内部碎片,因为它报告用于每个分配的额外字节。
但是,我主要关心的是如何弄清楚外部碎片。 我知道/proc/[pid]/smaps
堆大小和pmap-d[pid] anon
统计信息,但我发现很难从外部碎片解释它们。
我也知道LD_PRELOAD
,我可以动态连接/lib/i386-linux-gnu/libmemusage.so
。该库输出堆总数,峰值和所请求分配大小的分布。
我知道__malloc__hook
现在已经被弃用了,我并不想依靠特定的实施统计,如malloc_stats()
和mallinfo()
。但是,如果您有任何建议使用这两个请让我知道。
我可以告诉外部碎片问题,当请求不能满足时,因为堆中没有连续的空间,但所请求的总大小分散在该区域周围。
我还没有想出,如何获得所需的统计数据,以便我可以计算出这种影响。例如不同的公式,说明我必须捕获live_memory
或获得total_free_pages
,或获得largest_free_block
的大小。 我如何能够通过堆“遍历”并收集这些统计信息?
谢谢大家提前。
我不知道回答你的问题,但如果这是一个问题,也许你可以使用malloc来从系统得到一大块,并为你特别的数据更专业的分配器。 – GRAYgoose124