这个问题的简短答案是,这些值均不能可靠地指示可执行文件实际使用了多少内存,并且它们都不适合调试内存泄漏。
专用字节是指进程可执行文件要求的内存量,不一定是实际使用的内存量。它们是“私有的”,因为它们(通常)不包括内存映射文件(即共享的DLL)。但是-这很重要-它们不一定排除那些文件分配的内存。无法判断私有字节的更改是由于可执行文件本身还是由于链接库引起的。专用字节也不是唯一的物理内存。它们可以分页到磁盘或备用页列表中(即不再使用,但也没有分页)。
工作集是指该进程使用的总物理内存(RAM)。但是,与专用字节不同,它还包括内存映射文件和各种其他资源,因此它的度量甚至比专用字节低。这与任务管理器的“内存使用情况”中报告的值相同,并且近年来一直是无休止的混乱之源。从某种意义上讲,可以解决工作集中的内存而无页面错误;然而,在待机页面名单也仍然物理内存中但没有报告的工作组,这就是为什么你会看到“内存使用”当最小化的应用程序突然下降。
虚拟字节是整个过程占用的虚拟地址总空间。从某种意义上说,这就像工作集,因为它包括内存映射文件(共享的DLL),但是它还包括备用列表中的数据以及已经被调出并位于磁盘上某个页面文件中的数据。系统在高负载下由每个进程使用的虚拟字节总数将比计算机实际拥有的内存多得多。
因此,关系为:
- 专用字节是您的应用程序实际分配的,但包括页面文件的使用情况;
- 工作集是非分页的专用字节加上内存映射的文件;
- 虚拟字节是工作集以及分页的专用字节和备用列表。
这里还有另一个问题。就像共享库可分配内存,应用程序模块内部,导致潜在的误判在应用程序的专用字节报道,您的应用程序也可能最终会内部分配的内存共享模块,导致假阴性。这意味着您的应用程序实际上有可能发生内存泄漏,而该泄漏根本不会出现在“专用字节”中。不太可能,但可能。
专用字节是可执行文件正在使用的内存量的合理近似值,可用于帮助缩小潜在的内存泄漏候选对象的范围。如果您看到数量不断增加并且不断增长,则需要检查该过程是否泄漏。但是,这不能证明存在或不存在泄漏。
实际上,Visual Studio是检测/纠正Windows中内存泄漏最有效的工具之一(链接转到使用VS进行内存泄漏的页面,而不是产品页面)。 Rational Purify是另一种可能性。Microsoft 在此主题上也有一个更通用的最佳实践文档。在上一个问题中列出了更多工具。
我希望这可以清除一些问题!跟踪内存泄漏是调试中最困难的事情之一。祝好运。