我已经在c中创建了一个程序,并希望看到它使用和注意了多少内存,通常使用它时内存使用量增加(在启动时它使用大约250k,现在它是1.5mb)。 afaik,我释放了所有未使用的内存,并在一段时间后,应用程序使用更少的内存。是否有可能,释放的内存只是从“活动”内存转移到“有线”或其他东西,所以当需要可用空间时它会被释放? 顺便说一句。我的机器在mac os x上运行,如果这很重要的话。
答案 0 :(得分:9)
如何确定内存使用情况?您是否尝试使用valgrind
来查找潜在的内存泄漏?这真的很容易。只需使用valgrind
启动您的应用程序,运行它,然后查看结构良好的输出。
答案 1 :(得分:7)
如果您正在查看操作系统的内存使用情况,您可能会看到此行为。释放的内存不会自动返回到操作系统,但通常会保留在进程中,并且可以在以后进行malloced。你所看到的通常是记忆使用的高水位标记。
正如Konrad Rudolph建议的那样,使用一些东西来检查进程内部的内存,以寻找内存链接。
答案 2 :(得分:6)
C库通常不会向操作系统返回“小”分配。相反,它会在下次使用malloc
时保留内存。
但是,许多C库会释放大块,所以你可以尝试使用几兆字节的malloc,然后释放它。
答案 3 :(得分:2)
在OSX上,如果您已经从OSX安装了Developer Tools,那么您应该可以使用MallocDebug.app(因为您可能无法为OSX找到valgrind的端口)。
/Developer/Applications/PerformanceTools/MallocDebug.app
答案 4 :(得分:2)
我同意每个人已经说过的话,但我确实想补充一些特定于os x的澄清言论:
首先,操作系统实际使用vm_allocate
分配内存,它一次分配整个页面。因为与此相关的成本与其他人所说的相同,所以当您通过free(3)
返回内存时,C库不会仅释放页面。具体来说,如果内存页面中有其他分配,则不会释放。目前,mac os x中的内存页面为4096字节。页面中的字节数可以使用sysctl(2)
以编码方式确定,或者更容易使用getpagesize(2)
确定。您可以使用此信息来优化内存使用情况。
其次,用户空间应用程序不连接内存。通常,内核为关键数据结构连接内存。有线内存基本上是永远不会被换出的内存,永远不会产生页面错误。如果由于某种原因,在有线内存页面中生成页面错误,内核将发生混乱,您的计算机将崩溃。如果您的应用程序将计算机的有线内存增加了一个显着的数量,那么这是一个非常糟糕的迹象。它通常意味着您的应用程序正在做一些能够显着增加内核数据结构的东西,比如分配而不是收获数百个子进程线程。 (当然,这是一般性陈述......在某些情况下,这种增长是预期的,就像开发虚拟主机或类似的东西一样)。
答案 5 :(得分:1)
除了其他人已经写过的内容:
malloc()从操作系统中分配更大的块,并以malloc()的形式将其分成更小的块。当free()时,首先进入一个空闲列表,如果大小适合,可以由另一个malloc快速重用。它可能在这个时候与另一个免费项目合并,形成更大的空闲块,以避免碎片(那里存在一大堆不同的算法,从freeLists到二进制大小的片段到散列,还有什么不是)。 当释放的片段到达以便可以连接多个片段时,free()通常会这样做,但有时片段仍然存在,具体取决于malloc()和free()的大小和顺序。此外,只有在创建了大的这样的空闲块时,它才会(有时)作为块返回到OS。但通常情况下,malloc()将东西放在口袋中,取决于分配/自由比率(许多启发式方法,有时候通常可以使用编译或标记选项)。
注意,没有一个malloc / free algotrithm。有很多不同的实现(和文献)。高度系统,操作系统和库依赖。