关于 帮助理解 Windows 内存:帮助理解 Windows 内存 – \\”Working Set\\”

Help understanding Windows memory - "Working Set"

我一直在跟踪我的应用程序中的一些内存泄漏。这是一个真正的痛苦,但我终于收紧了一切。但是,有一点 Windows 内存管理让我感到困惑。这是应用程序的内存使用情况随时间推移的打印输出...

1
2
3
4
5
6
7
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。这在一夜之间发生了,因为应用程序基本上什么都不做。

工作集(这是任务管理器向我显示的)似乎能够受到其他应用程序(如调试器)的影响(正如我在寻找内存泄漏时了解到的那样)。在阅读了关于工作集是什么的文档后,我仍然没有很好的理解。

感谢任何帮助。

更新:感谢响应者提供的一些链接以及一些额外的搜索,我对单独的进程如何导致我的进程的工作集增长有了更好的理解。很高兴知道工作集中的峰值并不一定表明您的应用程序正在泄漏...不依赖任务管理器进行内存评估的进一步原因:)

有用的链接:

关于内存使用的几句话或:工作集与私有工作集

Cyber??Notes:Windows 内存使用说明


简单地说,工作集是您的进程当前拥有的内存页面的集合,并且没有被换出(即在 RAM 中)。然而,这有点不准确。现实要复杂得多。

Windows 为每个进程维护一个最小工作集大小和一个最大工作集大小。最小工作集很简单,这是 Windows 将授予每个进程的内容(只要可以,受物理限制)。

最大工作集更可疑。如果您的程序使用的内存超出其配额,Windows 将丢弃一些页面。但是,虽然它们不再在您的工作集中,但这些页面不一定"消失"。

相反,这些页面会从您的工作集中移除并移至可用页面池中。因此,如果某个其他程序需要更多内存并且没有剩余已清除的页面,则您的页面将被清除并分配给不同的进程。当您访问它们时,需要再次从交换文件中获取它们,如果您仍然高于最大工作集大小,可能会清除其他页面。

但是,如果同时没有人要求更多内存(或者如果所有需求都可以通过未使用的页面来满足),那么访问其中一个页面只会让它"神奇地重新出现"并踢出另一个页面取而代之。

因此,您的进程可以在 RAM 中拥有比其工作集中实际更多的页面,但它并不"正式"拥有它们。


驻留集/工作集是当前驻留在物理内存中的虚拟地址空间的一部分,因此不会被换出