如何找出记忆的去向

the*_*ill 5 c++ xcode memory-management visual-studio

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

更新:

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

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

Han*_*ant 2

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

如果您测量的实际上是虚拟内存页面:这也很正常。释放内存后,堆块将添加到空闲块列表中,以供下一次内存分配使用。如果释放内存恰好释放了整个范围的页面,那么内存管理器有机会取消该范围的映射。这种情况并不经常发生,它是内存管理器的实现细节,它的执行力度如何。