我的应用程序运行几个小时,任务管理器的任何值(vmsize,内存)都没有增加。但几个小时后我就会出现内存错误。
在sysinternals中,我看到“虚拟大小”正在不断增加,当它达到2 GB左右时,我开始出现内存错误。
那是什么样的内存泄漏? 我如何用代码演示它?是否可以使用任何代码片段重现相同的内容,其中没有内存值增加但只有sysinternsl进程资源管理器中的虚拟大小增加?
感谢任何建议
答案 0 :(得分:8)
虚拟大小是进程分配的页数,即那些 当前不在工作集中的页面(物理加载到RAM中)将位于系统的页面文件中。
通常,您分配未释放的内存。如果没有像Rational Purify或Boundschecker这样的特殊工具,这很难在代码中找到。使用sysinternals,你会发现必须有泄漏,但绝不会告诉你在哪里......
如果您的软件不是那么大,您可以尝试注销“新”和“删除”,并通过管理已分配对象的列表来查看内存中是否有太多对象(让您自己的内存调试器如此说) 。 Windows世界中有一些助手,如CRT memory checking utils from Microsoft。它们在某些情况下很有用。
答案 1 :(得分:4)
从事物的声音来看,你的地址空间已经不多了。 32位Windows将地址空间分成两半,一半用于用户程序,另一半用于系统,因此每个占用2 GB。
最常见的原因是将内存空间分割到无法找到足够分配的块的程度。不幸的是,如果不知道你正在做什么,很难猜出为什么会发生这种情况。
答案 2 :(得分:2)
根据sysinternals论坛上的this thread,虚拟大小对应于进程的地址空间(我猜测提交和保留的内存页面)
答案 3 :(得分:1)
Virtual Size似乎包含以下类型的已分配页面: MEM_MAPPED(用于数据视图) MEM_IMAGE(用于可执行图像视图) MEM_PRIVATE(通常分配的页面内存)
它不是数据的唯一“内存”,还包括* .dll-s和FileMapping机制的页面空间。