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