这个问题的简单答案是这些值中没有一个是一个可执行文件实际使用多少内存的可靠指标,也没有一个是真正适合调试内存泄漏的值。
二等兵拜特斯引用进程可执行文件的内存量。索要-不一定是数额实际使用..它们是“私有”的,因为它们(通常)排除内存映射文件(即共享DLL)。但是-这是个陷阱-它们不一定排除记忆由这些文件分配..无法判断私有字节的更改是由于可执行文件本身还是链接库造成的。私有字节也是不完全是物理内存;可以将它们分页到磁盘或备用页列表中(即不再使用,但也不分页)。
工作装置指的是总数物理进程使用的内存(RAM)。然而,与私有字节不同的是,它还包括内存映射文件和各种其他资源,因此它比私有字节更不准确。这个值与TaskManager的“MEM使用”中报告的值相同,并且是近年来造成无数混乱的根源。工作集中的内存是“物理的”,也就是说它可以在没有页面错误的情况下被处理;但是,备用页列表是也物理上仍然在内存中,但在工作集中没有报告,这就是为什么当您最小化应用程序时,可能会看到“MEM使用量”突然下降。
虚拟字节是总数吗?虚拟地址空间被整个过程所占据。这与工作集类似,因为它包含内存映射文件(共享DLL),但它也包括待机列表中的数据和已被分页并位于磁盘某处的分页文件中的数据。在重载下,每个进程在系统上使用的总虚拟字节加起来将大大超过机器实际拥有的内存。
所以关系是:
- 私有字节是您的应用程序实际分配的,但包括分页文件的使用;
- 工作集是非分页的私有字节加上内存映射的文件;
- 虚拟字节是工作集加上分页的私有字节和备用列表。
这里还有另一个问题:就像共享库可以在应用程序模块内分配内存一样,导致在应用程序的私有字节中报告的潜在错误,你的应用程序也可能最终在共享模块,导致错误负片..这意味着您的应用程序实际上有可能发生内存泄漏,而这种泄漏根本不会在私有字节中显示。不太可能,但有可能。
二等兵拜特斯是个合理的人近似您的可执行文件正在使用并可用于帮助的内存量。缩小范围内存泄漏的潜在候选列表;如果您看到数量不断地不断增加,您将希望检查该进程是否存在泄漏。但是,这不可能,证明是否有漏洞。
在Windows中检测/纠正内存泄漏的最有效工具之一实际上是VisualStudio(链接指向使用VS进行内存泄漏的页面,而不是产品页)。理性净化是另一种可能性。微软也有一个更通用的最佳做法文件在这个问题上。下面列出了更多的工具前一个问题.
我希望这能澄清一些事情!跟踪内存泄漏是调试过程中最困难的工作之一。祝好运。