C valgrind显示的额外堆程序内存消耗

C valgrind显示的额外堆程序内存消耗,c,linux,heap,valgrind,memory-fragmentation,C,Linux,Heap,Valgrind,Memory Fragmentation,我的程序占用了很多内存。这是valgrind massif tool向我展示的内容: -------------------------------------------------------------------------------- n time(i) total(B) useful-heap(B) extra-heap(B) stacks(B) ----------------------------------------------

我的程序占用了很多内存。这是valgrind massif tool向我展示的内容:

--------------------------------------------------------------------------------
  n        time(i)         total(B)   useful-heap(B) extra-heap(B)    stacks(B)
--------------------------------------------------------------------------------
 28 38,531,086,036      760,235,208      143,002,822   617,232,386            0
正如您所看到的,额外的部分比有用的堆大几倍

我应该怎么做来减少这些额外的内存? 减少分配

这就是所谓的内存碎片吗


操作系统:Linux2.6。程序是用C语言编写的。它应该可以24\7天工作,并且可以处理大量数据。

您可以少分配一些较大的数据,也可以调整堆—后者将是特定于实现的

这不是碎片,当你要求7个字节时,堆分配的字节不少于7个,也就是说16个字节,所以9个字节变成了“额外的”,实际上是浪费的。这样做有多种原因,例如,为了保持对齐。

根据,额外堆字节如下所示:

额外堆字节数 在那一点上分配。这反映了 中分配的字节数 超出程序要求的部分。 有两个额外堆的来源 字节

首先,每个堆块都具有 与关联的管理字节 信息技术行政人员的确切人数 字节数取决于文件的详细信息 分配器。默认情况下,体量假定为8 每个块的字节数,从 例如,但这个数字可以是 通过--heap admin选项更改

第二,分配器通常将 请求发送到更大文件的字节数 数字,通常是8或16。这是 需要确保 在块内适当对齐。 如果需要N个字节,则为Massif 将N四舍五入到最接近的 由--alignment指定的值 选择权

这听起来不像是记忆碎片

内存碎片通常是由大量小的分配引起的。最终,分配的每个内存单元之间的间隙很小,因此很难获得用于更大分配的连续内存区域


为了防止内存分配,基本上要减少分配!尽可能地使用堆栈空间(例如,不需要使用新的),如果可能的话,考虑频繁分配的对象,这样就不会分配内存。

< P>你是否分配了许多非常小的对象——比如,仅仅是几个字节?每个分配都有一定的开销(例如,
free
需要知道块有多大)

这有时被称为“内部碎片”,与“外部碎片”相反,外部碎片中有一定数量的未分配内存,但您无法使用它,因为它被分割成太小的块,无法使用。(malloc
malloc
无法返回非常小的块的另一个原因是,这有助于减少外部碎片。)


如果你分配了很多非常小的对象,你应该考虑单独管理它们,而不是单独在堆上分配它们。如果你做得对,这在其他方面也可能更好(例如,改善内存位置)。

你说它全天候运行吗?内存使用是否会随着运行而增长?不,不会。没有内存泄漏。恐怕我看不到用外部碎片交换内部碎片的好处。这真的是malloc屏蔽额外空间的原因吗?这是一个原因。(这当然不是原因。其他可能的原因:对齐、确保有空间存放元数据、减少大小类的数量以简化
malloc
internal。)最大外部碎片比率类似于日志(max_size/granularity),但实际上这是一种悲观的做法。因此,让所有块都是(比如)8或16字节的倍数可以减少外部碎片。它增加了内部碎片,但如果大多数块都相当大,这并不重要。open_memstream是许多小分配的罪魁祸首。您认为massif是额外分配的责任吗?在测试程序的实际运行中不会发生这种情况?