我有一个问题一直困扰着我。
在Windows调试器中,有!heap -s
命令输出虚拟内存的堆状态,并使用以下公式计算外部碎片:
External fragmentation = 1 - (larget free block / total free size)
linux中是否有类似的方法输出计算效果所需的统计数据?
现在长篇大论:
我有一个C应用程序,使用malloc和free分配和释放不同大小的空间,每个分配具有不同的生命周期。
我使用的平台是Lubuntu,因此ptmalloc2
算法是默认的。
我知道这些分配是在虚拟用户空间堆中提供的(除了大于128Kb的那些,分配器使用mmap
),并且在实际访问时映射到物理页面。
大多数分配的大小<1。 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
的大小。
如何在堆中“遍历”并收集这些统计信息?
提前谢谢大家。
答案 0 :(得分:0)
我认为这取决于您使用的分配器。也就是说,对于您正在使用的 malloc (等)和 free 实现,您可能需要不同的策略。如果实现没有提供您寻求的信息作为扩展,您可能必须阅读其源代码并键入您自己的逻辑来检查分配状态。
我相信页面到交换空间和物理RAM的映射处于较低的水平,因此不会特别帮助您实现目标。 malloc (等)和免费实施可能会或可能不会关心那些较低级别的细节。
如果您确定使用 ptmalloc2 ,是否可以找到其源代码?