c – 如何找出记忆的去向

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

更新:

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

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

解决方法

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

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

相关文章

在有效期内的苹果开发者账号(类型为个人或者公司账号)。还...
Appuploader官网--IOS ipa上传发布工具,证书制作工具跨平台...
苹果在9月13号凌晨(北京时间)发布 iOS 16,该系统的设备可...
计算机图形学--OpenGL递归实现光线追踪
Xcode 14打出来的包在低版本系统运行时会崩溃,报错信息是Li...