- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试使用 perfmon Windows 实用程序来调试进程中的内存泄漏。
这是 perfmon 对这些术语的解释:
工作集是该进程的工作集的当前大小(以字节为单位)。工作集是进程中的线程最近接触的内存页集。如果计算机中的可用内存高于阈值,则即使页面未在使用中,它们也会保留在进程的工作集中。当可用内存低于阈值时,将从工作集中修剪页面。如果需要它们,它们将在离开主内存之前软故障回到工作集中。
虚拟字节是进程正在使用的虚拟地址空间的当前大小(以字节为单位)。虚拟地址空间的使用并不一定意味着磁盘或主内存页面的相应使用。虚拟空间是有限的,进程会限制其加载库的能力。
私有(private)字节是该进程已分配且不能与其他进程共享的内存的当前大小(以字节为单位)。
这些是我的问题:
我应该测量私有(private)字节来确定进程是否有任何泄漏,因为它不涉及任何共享库,并且任何泄漏(如果发生)将来自进程本身?
该进程消耗的总内存是多少?是虚拟字节还是虚拟字节和工作集的总和?
私有(private)字节、工作集和虚拟字节之间有什么关系吗?
还有其他工具可以更好地了解内存使用情况吗?
最佳答案
这个问题的简短回答是,这些值都不能可靠地指示可执行文件实际使用了多少内存,并且它们都不适合调试内存泄漏。
私有(private)字节是指进程可执行文件请求的内存量 - 不一定是实际使用的内存量。它们是“私有(private)的”,因为它们(通常)排除内存映射文件(即共享 DLL)。但是 - 这里有一个问题 - 它们不一定排除这些文件分配的内存。无法判断私有(private)字节的更改是由于可执行文件本身引起的,还是由于链接库引起的。私有(private)字节也不专有的物理内存;它们可以被分页到磁盘或备用页面列表中(即不再使用,但也尚未被分页)。
工作集是指进程使用的总物理内存(RAM)。然而,与私有(private)字节不同,这还包括内存映射文件和各种其他资源,因此它的测量精度甚至比私有(private)字节还要低。这与任务管理器的“内存使用情况”中报告的值相同,并且近年来一直是无数困惑的根源。工作集中的内存是“物理的”,因为它可以在没有页面错误的情况下进行寻址;但是,备用页面列表也仍然物理地位于内存中,但未在工作集中报告,这就是为什么当您最小化应用程序时,您可能会看到“内存使用情况”突然下降。
虚拟字节是整个进程占用的总虚拟地址空间。这就像工作集,从某种意义上说,它包括内存映射文件(共享 DLL),但它还包括备用列表中的数据以及已被调出并位于磁盘上某处页面文件中的数据。在重负载下系统上每个进程使用的总虚拟字节数加起来将比机器实际拥有的内存多得多。
所以关系是:
这里还有一个问题;正如共享库可以在应用程序模块内分配内存,从而导致应用程序的私有(private)字节中报告潜在的误报一样,您的应用程序也可能最终在共享模块内分配内存,导致假阴性。这意味着您的应用程序实际上可能存在内存泄漏,而该泄漏根本不会在专用字节中体现出来。不太可能,但有可能。
私有(private)字节是可执行文件正在使用的内存量的合理近似值,可用于帮助缩小潜在内存泄漏候选者的列表;如果你看到这个数字不断地、无休止地增长,你会想要检查该过程是否有泄漏。然而,这不能证明是否存在泄漏。
Windows 中检测/纠正内存泄漏的最有效工具之一实际上是 Visual Studio (链接转到有关使用 VS 解决内存泄漏的页面,而不是产品页面)。 Rational Purify是另一种可能性。微软还有一个更通用的best practices document关于这个话题。此 previous question 中列出了更多工具.
我希望这能澄清一些事情!跟踪内存泄漏是调试中最困难的事情之一。祝你好运。
关于debugging - 什么是私有(private)字节、虚拟字节、工作集?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1984186/
据我所知,在 C# 中,所有字段默认都是私有(private)的,如果没有另外标记的话。 class Foo { private string bar; } class Foo { strin
这个问题在这里已经有了答案: Why is it allowed to access Java private fields via reflection? (7 个答案) 关闭 6 年前。 使用反
在 C#(和许多其他语言)中,访问相同类型的其他实例的私有(private)字段是完全合法的。例如: public class Foo { private bool aBool; pu
使用私有(private)方法通过将一些决策点重构为单独的方法来降低 CC 会降低实际方法的 CC 并易于阅读,但不会减少在测试中获得完整分支覆盖的工作量。 这合理吗?你有什么现场经验? 最佳答案 好
在下面的例子中,模块outer有一个私有(private)类型Private和一个私有(private)内部模块inner。 inner 能够访问Private(因为子模块可以访问其父级的私有(pri
class Person def one @var = 99 self.two end private def two p @var end end p=P
我在 Azure 中创建了 VNET。我放入了一个子集 Azure Private Link,它在 VNET 之外和另一台虚拟机中调用 Azure Function。 当我尝试通过专用 IP 调用专用
我在 Azure 中创建了 VNET。我放入了一个子集 Azure Private Link,它在 VNET 之外和另一台虚拟机中调用 Azure Function。 当我尝试通过专用 IP 调用专用
我正在尝试获得良好的 Ruby 编码风格。为防止意外调用具有相同名称的局部变量,我总是在适当的地方使用 self.。但是现在我偶然发现了这个: class MyClass "method" a
今天遇到一个案例类构造函数的奇怪问题。我想将构造函数设为私有(private),看来这不是问题。所以我已经在我的一个项目中尝试过它并且它有效。但在另一个项目中,我可以调用私有(private)构造函数
我想坚持使用记录,并且不想返回对象。所以我想知道是否可以将记录的字段设置为私有(private)?或者创建记录的私有(private)成员。其他具体类型(例如可区分联合)怎么样? 或者,这个要求是否违
我正在通过 Flickr API 进行经过身份验证的调用来访问照片。但我只得到我的公开照片,而没有任何私有(private)照片。 下面给出的是我正在使用的代码, Flickr f; Request
这两个类的行为不同;原因似乎与使用 private[this] 声明而不是 private 有关。有人可以解释一下为什么吗? 私有(private): class Person( private
在 private 中的 1000 秒 private 之后,我想到可能不需要它 public class Outer { private static class Inner { // yo
我有以下代码: class C { private enum E { // ... } } private extension C { func f(e: E)
OOP 语言中是否有object-private 的概念??我的意思是比经典的私有(private)访问限制更多? Private (or class-private) restricts the a
swift 3.0 我知道fileprivate访问级别修饰符将函数/属性的使用限制在声明它的源文件和 private - 仅限于声明的词法范围。但似乎这条规则不适用于扩展。例如。此代码有效: cla
即将推出的 Delphi 版本中启用该功能的功能怎么样? 也许它可能是一个编译器开关,促进所有 ** private **s to ** strict private **小号。 ... 或者它可能是
我可以通过将函数放入类的私有(private)扩展中来创建私有(private)函数,而不是通过不断调用 private func functionName(){} 来创建新的私有(private)函
部署专用端点并需要专用 IP 地址作为输出,但似乎无法正确获取值查询。下面的结果是“模板输出'主机名'无效:语言表达式属性|'privateIPAddress'具有无效的数组索引..(代码:Deplo
我是一名优秀的程序员,十分优秀!