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