如何找出记忆的去向

时间:2010-06-01 08:41:21

标签: c++ visual-studio xcode memory-management

我遇到的情况是,加载和关闭文档的循环会占用几Mb的RAM。这个内存不会被泄露为某些拥有它并在应用程序退出时清理它(Visual Leak Detector和Mac Leak工具就此达成一致)。但是,我想知道它的发展方向。我假设它是应用程序中的某种缓存,当文档加载时会填充,但在文档关闭时不会释放。我可以使用哪些方法或工具来确定这些分配的位置?

更新:

在Hans的帖子后,我在应用程序中添加了一个循环,以反复打开和关闭文档。我发现在加载前几个文档后,内存使用率(Process Explorer报告的“Private Bytes”)有一个初始跳跃,但之后它不再增加。所以这表明没有新的分配,而且明显的增加可能主要是由于传呼的假象。

我还仔细研究了Mac上的Instruments,这对查看分配发生的位置很有用:创建一个由Allocations和Leaks工具组成的工具,然后在一个周期的开始和结束时添加一个堆快照在Heapshots列表中,它将显示相对于上一个快照的所有分配增量。这表明在Mac上,内存分配 正在增加,但这是由于内部缓存(如CoreGraphics绘图),我们几乎无法控制。

4 个答案:

答案 0 :(得分:4)

如果您可以可靠地重现这一点,您应该能够使用MS CRT中的调试堆来解决此问题。从这里开始:Memory Leak Detection and Isolation

答案 1 :(得分:2)

嗯,实际上你有泄漏。 当应用程序退出操作系统时,清理所有资源:在退出后永久分配内存的意义上没有应用程序泄漏。 XCode有一个工具可以帮助您识别泄漏。
查看

Run->Run with performance Tool->Leaks
这将运行您的应用程序,其中包含有助于您找到泄漏的代码。

答案 2 :(得分:2)

假设它实际上是你测量过的RAM:确定这是完全正常的。您的程序在加载文档时正在主动寻址虚拟内存页面,它们将被映射到RAM。他们将留在那里,直到另一个进程需要将页面映射到RAM。有些操作系统会先在Windows上修剪工作集,例如当应用程序的窗口最小化时。

如果它实际上是你测量的虚拟内存页面:这也是正常的。释放内存后,堆块将添加到空闲块列表中,准备好由下一个内存分配使用。如果释放内存恰好释放整个页面范围,那么内存管理器就有机会取消映射该范围。它并不经常发生,它的内存管理器的实现细节是多么积极地发生。

答案 3 :(得分:0)

可能对某人有所帮助。我认为激活僵尸物体检测的Xcode 4.2(方案编辑中的一个复选框)像疯了一样吃内存 - 一分钟内~4GB。如果您的应用程序在Xcode下运行内存而不是其他情况,请确保检查这一点。内存分配和泄漏工具也没有任何效果。