2010-06-12 31 views
14

我的应用程序运行了几个小时,没有增加任何值(vmsize,内存)的任务管理器。但几个小时后,我发现内存不足错误。什么是sysinternals进程管理器中的“虚拟大小”

在sysinternals我看到“虚拟大小”不断增加,当它达到2 GB左右时,我开始出现内存错误。

那么是什么样的内存泄漏? 我如何用代码演示它?是否有可能用任何代码片段重现同样的事情,其中​​没有一个内存值增加,但只有sysinternsl进程管理器中的虚拟大小增加了?

感谢您的任何建议

+0

该问题应该有一个Windows标记。我很想从Linux pov回应;) – Dummy00001 2010-06-12 22:12:16

回答

4

从事物的声音,你运行的地址空间。 32位Windows将地址空间分成一半,一半用于用户程序,另一半用于系统,因此每个都可以获得2千兆字节。

这最常见的原因是将内存空间分割为无法找到足够大的分区块。不幸的是,在不了解更多关于你在做什么的情况下,很难猜出为什么会发生这种情况。

8

虚拟大小是进程分配的页数,那些当前不在工作集中的物理页(加载到RAM中的 )将位于系统的页面文件中。

通常情况下,您会分配未释放的内存。例如,如果没有像Rational Purify或Boundschecker这样的特殊工具,这可能很难在代码中找到。使用sysinternals,您会发现必须有泄漏,但它绝不会告诉您在哪里...

如果您的软件不是那么大,您可以尝试注销“新建”和“删除”并查看如果通过管理分配的对象列表(如果你自己的内存调试器这么说),那么内存中的对象太多。在Windows世界中有一些助手,如CRT memory checking utils from Microsoft。在某些情况下它们很有用。

2

根据this thread上的Sysinternals论坛,虚拟大小对应于进程的地址空间(我猜的内存COMMITED和保留页)

1

看来,虚拟大小包括分配有以下类型的网页: MEM_MAPPED(数据视图) MEM_IMAGE(可执行图像视图) MEM_PRIVATE(通常分配的页面内存)

这不是唯一的“记忆”的数据,而且还包括页面空间的* .dll-S和文件映射机制。