我一直在跟踪应用程序中的一些内存泄漏。这是一个真正的痛苦,但我终于收紧了一切。但是,有一点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
答案 0 :(得分:6)
简单地说,工作集是您的进程当前拥有的内存页面的集合,而不是换出(即在RAM中)。然而,这有点不准确。现实要复杂得多。
Windows维护每个进程的最小工作集大小和最大工作集大小。最小的工作集很容易,它是Windows将授予每个进程的权限(只要它可以通过物理限制)。
最大工作集更可疑。如果您的程序使用的内存超过其配额中的内存,Windows将删除一些页面。但是,虽然它们已不在您的工作集中,但这些页面不一定“已消失”。
相反,这些页面将从您的工作集中删除并移动到可用页面池中。因此,如果某些其他程序需要更多内存并且没有剩余已清除的页面,则您的页面将被清除,并分配给不同的进程。当您访问它们时,如果仍然高于最大工作集大小,则需要再次从交换文件中提取它们,可能会清除其他页面。
但是,如果没有人要求同时获得更多内存(或者无论如何都可以通过未使用的页面满足所有要求),那么访问其中一个页面只会让它“神奇地重新出现”并踢出另一页取而代之。
因此,您的进程可以在RAM中拥有比实际工作集中更多的页面,但它并不“正式”拥有它们。
答案 1 :(得分:3)