2009-01-15 25 views
2

我在c中创建了一个程序,并且想要查看它使用和注意的内存量,通常使用它的内存使用量会增加(在启动时它使用大约250k,现在它的值为1.5mb)。 afaik,我释放了所有未使用的内存,并在一段时间后,该应用程序使用更少的内存。是否有可能,释放的内存是从“活动”内存转移到“有线”内存,因此当需要空闲空间时会释放内存? btw。我的机器在mac os x上运行,如果这很重要的话。为什么我的c程序没有像应该那样释放内存?

回答

7

如果您正在查看操作系统的内存使用情况,您很可能会看到此行为。释放的内存不会自动返回到操作系统,但通常与进程保持一致,并且可以在稍后插入。你看到的通常是内存使用的高水位标记。

正如Konrad Rudolph所建议的那样,使用检查进程内部的内存来查找内存链接的东西。

9

如何确定内存使用情况?您是否尝试过使用valgrind来查找潜在的内存泄漏?这很容易。只需从valgrind开始您的应用程序,运行它,然后查看结构良好的输出。

+0

eeehm ..我刚开始活动monitor.app,并观察它使用多少内存。 – Nino 2009-01-15 18:40:05

+0

我问的原因是monitor.app和类似的应用程序不能可靠地显示真实的内存使用情况。赞恩指出了其中一个原因。 – 2009-01-16 00:26:57

6

C库通常不会向操作系统返回“小”分配。相反,它会保留下次您使用malloc的内存。

但是,许多C库会释放大块,所以你可以尝试做几兆字节的malloc然后释放它。

2

在OSX上,如果您已经从OSX安装了开发人员工具(因为您可能无法找到用于OSX的valgrind端口),您应该可以使用MallocDebug.app。

/Developer/Applications/PerformanceTools/MallocDebug.app

2

我同意大家已经说过,但我不希望只是一些澄清具体评论添加到OS X:

首先,操作系统实际上使用分配整个页面的vm_allocate分配内存。由于与此相关的成本与其他人相同,因此C库不会在通过free(3)返回内存时取消分配页面。具体来说,如果内存页面中有其他分配,它将不会被释放。当前内存页面在mac os x中为4096字节。页面中的字节数可以用sysctl(2)或更容易地用getpagesize(2)以编程方式确定。您可以使用这些信息来优化您的内存使用情况。

其次,用户空间应用程序不会连线内存。通常,内核会为关键数据结构提供内存连线。有线存储器基本上是永远不会换出的内存,永远不会产生页面错误。如果出于某种原因在有线存储器页面中生成了页面错误,内核将会出现混乱,并且您的计算机将崩溃。如果您的应用程序将您的计算机的有线存储器数量增加了很多,这是一个非常糟糕的信号。它通常意味着你的应用程序正在做一些显着增加内核数据结构的事情,比如分配和不收获数百个子进程线程。 (当然,这是一个普遍的说法......在某些情况下,这种增长是可以预期的,就像开发一个虚拟主机或类似的东西一样)。

1

除了什么其他人已经写:

的malloc()从OS分配更大的块,并吐出它在更小的碎片,你的malloc()它。free()时,首先进入一个空闲列表,如果大小合适,可由另一个malloc快速重用。它可能在此时与另一个免费项目合并,形成更大的空闲块,以避免碎片(存在大量不同的算法,从freeLists到二进制大小的碎片到散列以及其他什么)。 当释放的碎片到达时,可以连接多个碎片,free()通常会这样做,但有时碎片会保留,这取决于malloc()和free()的大小和顺序。另外,只有当创建一个大的空闲块时,它才会(有时)作为一个块返回到操作系统。但通常,malloc()将事物放在其口袋中,取决于分配的/空闲的比率(许多启发式方法,有时还可以编译或标记选项)。

请注意,没有一个malloc/free的算法。有一大堆不同的实现(和文献)。高度系统,操作系统和库依赖。

相关问题