这是我的问题:运行一套程序后,free
告诉我,执行后大约 1 GB 没有内存。经过一些搜索,我发现SO: What really happens when you dont free after malloc(据我了解)明确表示缺少内存解除分配应该不是问题......(这是正确的吗?)
top
未显示任何使用大量内存的进程。
我怎样才能找到'发生了什么'到内存中,即哪个程序分配了它以及为什么在程序执行后它不是免费的?
free
在哪里收集信息?
(我正在运行最近的Ubuntu版本)
答案 0 :(得分:4)
是的,程序退出后,程序使用的内存将被释放。
“免费”中的统计数据令人困惑,但事实是其他程序可以使用内存:
http://sourcefrog.net/weblog/software/linux-kernel/free-mem.html
这是一个更好的事件链接:
答案 1 :(得分:2)
free (1)
用词不当,应该更正确地称为unused
,因为这就是它所显示的内容。或者也许它应该被称为physicalfree
(或者更准确地说,输出中的“自由”列应该被命名为“未使用”)。
你会注意到“缓冲”和“缓存”往往随着“免费”下降而上升。内存不会消失,只会分配给不同的“桶”。
空闲内存和未使用内存之间的区别在于,虽然两者都是“空闲”,但未使用的内存确实如此(没有使用的物理内存),而简单的“空闲”内存通常会移动到缓冲区缓存中。例如,所有可执行图像和库,任何只读或读执行的情况。如果稍后再次加载相同的文件,则“空闲”页面将再次映射到进程中,并且不必加载任何数据。
请注意,“未使用”实际上是一件坏事,虽然它不是很明显(听起来不错,不是吗?)。免费(但物理上使用)内存有用,而免费(未使用)内存意味着你可以节省内存的RAM。因此,拥有未使用的内存(例如通过清除页面)正是您不想要的内容 令人惊讶的是,在Windows下存在许多“内存优化器”工具,这些工具需要花费真正的钱而且这样做...
关于回收内存,其工作方式很简单:操作系统只删除对工作集中所有页面的引用。如果页面与另一个进程共享,则不会发生任何惊人的事情。如果它属于非匿名映射且不可写(或可写且未写入),则它将进入缓冲区缓存。否则,它就会变得很糟糕
这将删除分配有malloc
的所有内存以及可执行文件和文件映射使用的内存,以及(因为所有内存都基于页面)所有其他内容。
答案 2 :(得分:0)
可能是你的操作系统为了自己的目的而占用了这个空间。
例如,许多现代操作系统会在程序终止后将程序加载到内存中,以防您想再次启动它们。如果他们的猜测是正确的,它可以节省大量时间,但代价是一些未被使用的内存。有些操作系统甚至会推测性地加载一些常用的程序。
CPU利用率的工作方式相同。通常,当CPU处于“闲置”状态时,您的操作系统会推测性地做一些工作。