帮助理解 Windows 内存——“工作集”
Posted
技术标签:
【中文标题】帮助理解 Windows 内存——“工作集”【英文标题】:Help understanding Windows memory - "Working Set" 【发布时间】:2011-07-21 07:30:42 【问题描述】:我一直在跟踪我的应用程序中的一些内存泄漏。这是一个真正的痛苦,但我终于收紧了一切。但是,有一点 Windows 内存管理让我感到困惑。这是应用程序的内存使用情况随时间推移的打印输出...
Time PrivateMemorySize64 WorkingSet64
20:00:36 47480, 50144
20:01:06 47480, 50144
20:01:36 47480, 50144
20:02:06 47480, 149540
20:02:36 47480, 149540
20:03:06 47480, 149540
工作集在 30 秒内从 49 MB 跃升至 146。这在一夜之间发生了,因为应用程序基本上什么都不做。
工作集(这是任务管理器向我显示的)似乎能够受到其他应用程序(如调试器)的影响(正如我在寻找内存泄漏时了解到的那样)。在阅读了关于工作集是什么的文档后,我仍然没有很好的理解。
感谢任何帮助。
更新:感谢响应者提供的一些链接以及一些额外的搜索,我对单独的流程如何导致我的流程的工作集增长有了更好的了解。很高兴知道工作集中的峰值并不一定表明您的应用程序正在泄漏......进一步的理由不依赖任务管理器进行内存评估:)
有用的链接:
A few words on memory usage or: working set vs. private working set
CyberNotes: Windows Memory Usage Explained
【问题讨论】:
【参考方案1】:简单地说,工作集是您的进程当前拥有且未换出的内存页面的集合(即在 RAM 中)。然而,这有点不准确。现实要复杂得多。
Windows 为每个进程维护一个最小工作集大小和一个最大工作集大小。最小工作集很简单,这是 Windows 将授予每个进程的内容(只要可以,受物理限制)。
最大工作集更加可疑。如果您的程序使用的内存超出其配额,Windows 将丢弃一些页面。然而,虽然它们不再在您的工作集中,但这些页面不一定“消失”了。
相反,这些页面会从您的工作集中移除并移至可用页面池中。因此,如果某个其他程序需要更多内存并且没有剩余已清除的页面,则您的页面将被清除并分配给不同的进程。当您访问它们时,需要再次从交换文件中获取它们,如果您仍然高于最大工作集大小,可能会清除其他页面。
但是,如果同时没有人要求更多内存(或者如果所有需求都可以通过未使用的页面来满足),那么访问其中一个页面只会使其“神奇地重新出现”并踢出另一个页面取而代之。
因此,您的进程在 RAM 中的页面可能比其工作集中的实际页面多,但它并不“正式”拥有它们。
【讨论】:
【参考方案2】:Resident Set/Working Set 是 Virtual Address Space 的一部分,当前位于 Physical Memory 中,因此不是 Swapped Out
【讨论】:
单独的流程会如何影响这一点?看起来我的电脑在 20:00 开始运行病毒检查程序,这与高峰时间相吻合。 @Tim:外部进程可以将代码注入您的应用程序,让它启动新线程,执行代码,几乎任何事情。不知道在这种情况下是否发生了这种情况,但它肯定是可行的,您会看到这将如何影响工作集。以上是关于帮助理解 Windows 内存——“工作集”的主要内容,如果未能解决你的问题,请参考以下文章