为了账号安全,请及时绑定邮箱和手机立即绑定

什么是私有字节,虚拟字节,工作集?

/ 猿问

什么是私有字节,虚拟字节,工作集?

HUWWW 2019-07-03 18:47:44

什么是私有字节,虚拟字节,工作集?

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

PerfMon是这样解释这些术语的:

工作装置此进程的工作集的当前大小(以字节为单位)。工作集是进程中线程最近接触到的一组内存页。如果计算机中的空闲内存超过阈值,即使没有使用页面,页面仍留在进程的工作集中。当空闲内存低于阈值时,将从工作集中修剪页面。如果需要它们,那么在离开主内存之前,它们将被软故障恢复到工作集中。

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

二等兵拜特斯此进程分配的内存当前大小(以字节为单位),不能与其他进程共享。

以下是我的问题:

我应该衡量的是二等兵拜特(PrivateBytes),以确保流程是否存在任何泄漏,因为它不涉及任何共享库,如果发生任何泄漏,将来自进程本身?

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

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

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


查看完整描述

3 回答

?
慕田峪4524236

这个问题的简单答案是这些值中没有一个是一个可执行文件实际使用多少内存的可靠指标,也没有一个是真正适合调试内存泄漏的值。

二等兵拜特斯引用进程可执行文件的内存量。索要-不一定是数额实际使用..它们是“私有”的,因为它们(通常)排除内存映射文件(即共享DLL)。但是-这是个陷阱-它们不一定排除记忆由这些文件分配..无法判断私有字节的更改是由于可执行文件本身还是链接库造成的。私有字节也是完全是物理内存;可以将它们分页到磁盘或备用页列表中(即不再使用,但也不分页)。

工作装置指的是总数物理进程使用的内存(RAM)。然而,与私有字节不同的是,它还包括内存映射文件和各种其他资源,因此它比私有字节更不准确。这个值与TaskManager的“MEM使用”中报告的值相同,并且是近年来造成无数混乱的根源。工作集中的内存是“物理的”,也就是说它可以在没有页面错误的情况下被处理;但是,备用页列表是物理上仍然在内存中,但在工作集中没有报告,这就是为什么当您最小化应用程序时,可能会看到“MEM使用量”突然下降。

虚拟字节是总数吗?虚拟地址空间被整个过程所占据。这与工作集类似,因为它包含内存映射文件(共享DLL),但它也包括待机列表中的数据和已被分页并位于磁盘某处的分页文件中的数据。在重载下,每个进程在系统上使用的总虚拟字节加起来将大大超过机器实际拥有的内存。

所以关系是:

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

这里还有另一个问题:就像共享库可以在应用程序模块内分配内存一样,导致在应用程序的私有字节中报告的潜在错误,你的应用程序也可能最终在共享模块,导致错误负片..这意味着您的应用程序实际上有可能发生内存泄漏,而这种泄漏根本不会在私有字节中显示。不太可能,但有可能。

二等兵拜特斯是个合理的人近似您的可执行文件正在使用并可用于帮助的内存量。缩小范围内存泄漏的潜在候选列表;如果您看到数量不断地不断增加,您将希望检查该进程是否存在泄漏。但是,这不可能,证明是否有漏洞。

在Windows中检测/纠正内存泄漏的最有效工具之一实际上是VisualStudio(链接指向使用VS进行内存泄漏的页面,而不是产品页)。理性净化是另一种可能性。微软也有一个更通用的最佳做法文件在这个问题上。下面列出了更多的工具前一个问题.

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


查看完整回答
反对 回复 2019-07-03
?
慕雪6442864

您不应该尝试使用PerfMon、任务管理器或任何类似的工具来确定内存泄漏。它们有利于确定趋势,但对其他方面没有多大帮助。他们报告的绝对数字过于模糊和汇总,无法用于内存泄漏检测等特定任务。

先前对这个问题的答复对各种类型作了很好的解释。

您会询问有关工具推荐的问题:我推荐内存验证器。能够监视产生数十亿内存分配的应用程序。

http:/www.softareverify.com/cpp/Memory/index.html


查看完整回答
反对 回复 2019-07-03
?
明月笑刀无情

PerfMon计数器的定义从一开始就中断了,由于某些原因似乎很难纠正。

视频中提供了Windows内存管理的一个很好的概述“记忆管理之谜揭晓“在MSDN上:它涵盖了比跟踪内存泄漏(例如工作集管理)更多的主题,但是在相关主题中给出了足够的细节。


为了给您提示PerfMon计数器描述的问题,下面是关于“二等兵拜特斯表演反击-小心!“在MSDN上:

问:二等兵什么时候不是二等兵拜德?

当它不是居民的时候。

Private Bytes计数器报告进程的提交负责。也就是说,在交换文件中分配了多少空间,以便在交换时保存私有内存的内容。注意:由于可能与未提交的保留状态下的虚拟内存混淆,所以我避免使用“保留”一词。


从“绩效计划“在MSDN上:

3.3二等兵拜特斯

3.3.1说明

私有内存,定义为分配给其他进程不能共享的进程的内存。当多个这样的进程在一台机器上执行时,这个内存比共享内存更昂贵。传统的非托管dll中的私有内存通常由C+静态组成,约占DLL总工作集的5%。


查看完整回答
反对 回复 2019-07-03
  • 3 回答
  • 0 关注
  • 173 浏览
我要回答
慕课专栏
更多

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信