sysinternals 进程资源管理器中的“虚拟大小”是啥
Posted
技术标签:
【中文标题】sysinternals 进程资源管理器中的“虚拟大小”是啥【英文标题】:What is "Virtual Size" in sysinternals process explorersysinternals 进程资源管理器中的“虚拟大小”是什么 【发布时间】:2011-03-03 02:20:05 【问题描述】:我的应用程序运行了几个小时,任务管理器的任何值(vmsize,内存)都没有增加。但几个小时后,我得到了内存错误。
在 sysinternals 中,我看到“虚拟大小”不断增加,当它达到 2 GB 左右时,我开始出现内存错误。
那是什么类型的内存泄漏? 我如何用代码演示它?是否可以使用任何内存值都没有增加但只有 sysinternsl 进程资源管理器中的虚拟大小增加的代码来重现相同的东西?
感谢任何建议
【问题讨论】:
那个问题应该有一个 Windows 标签。我很想从 Linux pov 中做出回应;) 【参考方案1】:从事情的声音来看,您的地址空间已经用完了。 32 位 Windows 将地址空间分成两半,一半用于用户程序,另一半用于系统,因此每个空间为 2 GB。
造成这种情况的最常见原因是将内存空间碎片化到无法找到足够大的块来分配的程度。不幸的是,如果不知道更多关于你在做什么,很难猜测为什么会发生这种情况。
【讨论】:
【参考方案2】:虚拟大小是进程分配的页数,那些 当前不在工作集中的页面(物理加载到 RAM 中)将在系统的页面文件中。
通常您分配未释放的内存。如果没有像 Rational Purify 或 Boundschecker 这样的特殊工具,这可能很难在代码中追踪。使用 sysinternals,您会发现肯定有泄漏,但它绝不会告诉您在哪里......
如果您的软件不是那么大,您可以尝试注销“新建”和“删除”,并通过管理已分配对象列表来查看内存中是否有太多对象(可以说是制作自己的内存调试器) . Windows 世界中有一些助手,例如CRT memory checking utils from Microsoft。它们在某些情况下很有用。
【讨论】:
谢谢,但特别是在 Process Explorer Virtual Size 的上下文中,至少在 2021 年会显示保留和提交的页面(WinAPI 中有一个技巧只保留地址空间)。保留的页面将是“不" 在系统的页面文件中。【参考方案3】:根据 sysinternals 论坛上的this thread,虚拟大小对应于进程的地址空间(我猜是已提交和保留的内存页)
【讨论】:
谢谢,听起来很正确。【参考方案4】:Virtual Size 似乎包括以下类型的已分配页面: MEM_MAPPED(用于数据视图) MEM_IMAGE(用于可执行图像视图) MEM_PRIVATE(通常分配的页内存)
它不是唯一的数据“内存”,还包括*.dll-s和FileMapping机制的页面空间。
【讨论】:
以上是关于sysinternals 进程资源管理器中的“虚拟大小”是啥的主要内容,如果未能解决你的问题,请参考以下文章