Leo*_*Hat 5 c++ windows memory-management
我正在使用的应用程序表现出以下行为:
在特定的高内存操作期间,任务管理器(内存使用情况统计)下的进程的内存使用量达到大约2.5GB的峰值(注意:已设置注册表项以允许此操作,因为通常最大为2GB对于32位Windows下的进程)
操作完成后,进程大小缓慢开始以每秒1MB的速率降低.
我试图找出最简单的方法来快速确定谁释放了这个内存,以及它在哪里被释放.
我无法将内存分析器附加到我的代码中,我并不特别想覆盖new/ delete运算符来跟踪分配/解除分配(IOW,我想这样做而不重新编译我的代码).
任何人都可以提供有关如何通过Visual Studio调试器执行此操作的任何有用建议吗?
更新
我还应该提到它是一个多线程应用程序,因此暂停应用程序并通过调试器分析调用堆栈并不是最理想的选择.我考虑一次冻结一个不同的线程,看看内存是否停止减少,但我相当肯定这会导致应用程序崩溃.
啊!您看错柜台了!
Mem Usage并没有告诉你内存正在被释放。只是工作集正在被清除!这可能意味着某些其他应用程序需要内存,或者 VMM 决定将某些进程的页面标记为“备用”以供其他进程快速使用。这并不意味着VirtualFree,HeapFree或任何其他自由函数正在被调用。
查看提交大小(VM 大小、专用字节等)。
但是,如果您仍然想知道内存何时被解除提交或释放或您拥有什么,那么请中断一些空闲调用。例如(对于 Visual C++)
{,,kernel32.dll}HeapFree
Run Code Online (Sandbox Code Playgroud)
或者
{,,msvcr80.dll}free
Run Code Online (Sandbox Code Playgroud)
ETC。
或者只是上面的常规函数断点。只要确保它解析地址即可。
cdb/WinDbg 让你通过
bp kernel32!HeapFree
bp msvcrt!free
Run Code Online (Sandbox Code Playgroud)
ETC。
名称可能会有所不同,具体取决于您使用的 CRT 版本以及链接方式(通过/MT或/MD及其变体)