gpt4 book ai didi

debugging - 什么是私有(private)字节、虚拟字节、工作集?

转载 作者:行者123 更新时间:2023-12-03 03:55:20 26 4
gpt4 key购买 nike

我正在尝试使用 perfmon Windows 实用程序来调试进程中的内存泄漏。

这是 perfmon 对这些术语的解释:

工作集是该进程的工作集的当前大小(以字节为单位)。工作集是进程中的线程最近接触的内存页集。如果计算机中的可用内存高于阈值,则即使页面未在使用中,它们也会保留在进程的工作集中。当可用内存低于阈值时,将从工作集中修剪页面。如果需要它们,它们将在离开主内存之前软故障回到工作集中。

虚拟字节是进程正在使用的虚拟地址空间的当前大小(以字节为单位)。虚拟地址空间的使用并不一定意味着磁盘或主内存页面的相应使用。虚拟空间是有限的,进程会限制其加载库的能力。

私有(private)字节是该进程已分配且不能与其他进程共享的内存的当前大小(以字节为单位)。

这些是我的问题:

我应该测量私有(private)字节来确定进程是否有任何泄漏,因为它不涉及任何共享库,并且任何泄漏(如果发生)将来自进程本身?

该进程消耗的总内存是多少?是虚拟字节还是虚拟字节和工作集的总和?

私有(private)字节、工作集和虚拟字节之间有什么关系吗?

还有其他工具可以更好地了解内存使用情况吗?

最佳答案

这个问题的简短回答是,这些值都不能可靠地指示可执行文件实际使用了多少内存,并且它们都不适合调试内存泄漏。

私有(private)字节是指进程可执行文件请求的内存量 - 不一定是实际使用的内存量。它们是“私有(private)的”,因为它们(通常)排除内存映射文件(即共享 DLL)。但是 - 这里有一个问题 - 它们不一定排除这些文件分配的内存。无法判断私有(private)字节的更改是由于可执行文件本身引起的,还是由于链接库引起的。私有(private)字节也专有的物理内存;它们可以被分页到磁盘或备用页面列表中(即不再使用,但也尚未被分页)。

工作集是指进程使用的总物理内存(RAM)。然而,与私有(private)字节不同,这还包括内存映射文件和各种其他资源,因此它的测量精度甚至比私有(private)字节还要低。这与任务管理器的“内存使用情况”中报告的值相同,并且近年来一直是无数困惑的根源。工作集中的内存是“物理的”,因为它可以在没有页面错误的情况下进行寻址;但是,备用页面列表仍然物理地位于内存中,但未在工作集中报告,这就是为什么当您最小化应用程序时,您可能会看到“内存使用情况”突然下降。

虚拟字节是整个进程占用的总虚拟地址空间。这就像工作集,从某种意义上说,它包括内存映射文件(共享 DLL),但它还包括备用列表中的数据以及已被调出并位于磁盘上某处页面文件中的数据。在重负载下系统上每个进程使用的总虚拟字节数加起来将比机器实际拥有的内存多得多。

所以关系是:

  • 私有(private)字节是您的应用实际分配的字节,但包括页面文件的使用情况;
  • 工作集是非分页专用字节加上内存映射文件;
  • 虚拟字节是工作集加上分页专用字节和备用列表。

这里还有一个问题;正如共享库可以在应用程序模块内分配内存,从而导致应用程序的私有(private)字节中报告潜在的误报一样,您的应用程序也可能最终在共享模块内分配内存,导致假阴性。这意味着您的应用程序实际上可能存在内存泄漏,而该泄漏根本不会在专用字节中体现出来。不太可能,但有可能。

私有(private)字节是可执行文件正在使用的内存量的合理近似值,可用于帮助缩小潜在内存泄漏候选者的列表;如果你看到这个数字不断地、无休止地增长,你会想要检查该过程是否有泄漏。然而,这不能证明是否存在泄漏。

Windows 中检测/纠正内存泄漏的最有效工具之一实际上是 Visual Studio (链接转到有关使用 VS 解决内存泄漏的页面,而不是产品页面)。 Rational Purify是另一种可能性。微软还有一个更通用的best practices document关于这个话题。此 previous question 中列出了更多工具.

我希望这能澄清一些事情!跟踪内存泄漏是调试中最困难的事情之一。祝你好运。

关于debugging - 什么是私有(private)字节、虚拟字节、工作集?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1984186/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com