帮助理解Windows内存 - “工作集”

时间:2011-03-23 13:08:17

标签: windows memory

我一直在跟踪应用程序中的一些内存泄漏。这是一个真正的痛苦,但我终于收紧了一切。但是,有一点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

2 个答案:

答案 0 :(得分:6)

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

Windows维护每个进程的最小工作集大小和最大工作集大小。最小的工作集很容易,它是Windows将授予每个进程的权限(只要它可以通过物理限制)。

最大工作集更可疑。如果您的程序使用的内存超过其配额中的内存,Windows将删除一些页面。但是,虽然它们已不在您的工作集中,但这些页面不一定“已消失”。

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

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

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

答案 1 :(得分:3)