这个问题的简短回答是这些值都不能可靠地指示可执行文件实际使用了多少内存,并且它们都不适合调试内存泄漏。
私人字节指进程可执行文件拥有的内存量要求- 不一定是金额实际使用。它们是“私有的”,因为它们(通常)排除内存映射文件(即共享 DLL)。但是 - 这里有一个问题 - 它们并不一定排除记忆由这些文件分配。无法判断私有字节的更改是由于可执行文件本身引起的,还是由于链接库引起的。私有字节也是not完全物理内存;它们可以被分页到磁盘或备用页列表中(即不再使用,但也尚未被分页)。
工作集指的是总数physical进程使用的内存 (RAM)。然而,与私有字节不同,这还包括内存映射文件和各种其他资源,因此它的测量精度甚至比私有字节还要低。这与任务管理器的“内存使用情况”中报告的值相同,并且近年来一直是无数混乱的根源。工作集中的内存是“物理的”,因为它可以在没有页面错误的情况下进行寻址;然而,备用页面列表是also物理上仍在内存中,但未在工作集中报告,这就是为什么当您最小化应用程序时,您可能会看到“内存使用情况”突然下降。
虚拟字节是总数虚拟地址空间被整个进程占用。这就像工作集,从某种意义上说,它包括内存映射文件(共享 DLL),但它还包括备用列表中的数据以及已被调出并位于磁盘上某处页面文件中的数据。在重负载下,系统上每个进程使用的总虚拟字节数加起来将比机器实际拥有的内存多得多。
所以关系是:
- 私有字节是您的应用程序实际分配的字节,但包括页面文件使用情况;
- 工作集是非分页专用字节加上内存映射文件;
- 虚拟字节是工作集加上分页专用字节和备用列表。
这里还有一个问题;正如共享库可以在应用程序模块内分配内存一样,导致应用程序的私有字节中报告潜在的误报,your应用程序也可能最终在内部分配内存shared模块,导致错误底片。这意味着您的应用程序实际上可能存在内存泄漏,而该泄漏根本不会在专用字节中体现出来。不太可能,但有可能。
私有字节是合理的近似您的可执行文件正在使用的内存量,可以用来帮助缩小范围内存泄漏的潜在候选者列表;如果你看到这个数字不断地、无休止地增长,你会想要检查该过程是否有泄漏。然而,这不能prove是否存在泄漏。
实际上,在 Windows 中检测/纠正内存泄漏的最有效工具之一是视觉工作室 http://msdn.microsoft.com/en-us/library/x98tx3cf(VS.80).aspx(链接转到有关使用 VS 解决内存泄漏的页面,而不是产品页面)。理性净化 http://www-01.ibm.com/software/awdtools/purify/是另一种可能性。微软还有一个更通用的最佳实践文件 http://msdn.microsoft.com/en-us/library/dd744766(VS.85).aspx关于这个话题。这里列出了更多工具上一个问题 https://stackoverflow.com/questions/413477/is-there-a-good-valgrind-substitute-for-windows.
我希望这能澄清一些事情!跟踪内存泄漏是调试中最困难的事情之一。祝你好运。