【问题标题】:Who's using my memory: a lot of Virtual Allocations but small heaps谁在使用我的内存:大量虚拟分配但小堆
【发布时间】:2012-02-13 10:27:27
【问题描述】:

我的 WPF .net 应用程序似乎泄漏了内存(我也使用本机和 3rd 方组件)。我进行了一些内存转储,并使用 DebugDiag、WinDBG 和 VMMap 分析了这些转储。我已经看到托管堆以及本机堆和线程非常稳定(在低级别上)。然后我用DebugDiag做了一个分析。它表明到目前为止大部分是由“虚拟分配”分配的(2.5GB:1.2GB 已提交,1.2GB 保留)。

VMMap 向我展示了我的大部分内存要么是“私有数据”,要么是在一个转储中,甚至是“页表”......我如何才能确定谁对此负责? (我本来预计托管堆或本机堆会增长)

编辑(让我添加一些额外的计数器):

.NET CLR Memory | # Total committed Bytes        357945K  
.NET CLR Memory | # Total reserved Bytes         402554K  
.NET CLR Memory | Large Object Heap size          79182K  
Process | Private Bytes                         1299080K  
Process | Virtual Bytes                         2876524K


-------------------- Usage SUMMARY --------------------------
    TotSize (      KB)   Pct(Tots) Pct(Busy)   Usage
   92d50000 ( 2405696) : 57.36%    83.79%    : RegionUsageIsVAD
   50c11000 ( 1323076) : 31.55%    00.00%    : RegionUsageFree
   12c6c000 (  307632) : 07.33%    10.71%    : RegionUsageImage
    79fe000 (  124920) : 02.98%    04.35%    : RegionUsageStack
          0 (       0) : 00.00%    00.00%    : RegionUsageTeb
     540000 (    5376) : 00.13%    00.19%    : RegionUsageHeap
    1ae5000 (   27540) : 00.66%    00.96%    : RegionUsagePageHeap
          0 (       0) : 00.00%    00.00%    : RegionUsagePeb
          0 (       0) : 00.00%    00.00%    : RegionUsageProcessParametrs
          0 (       0) : 00.00%    00.00%    : RegionUsageEnvironmentBlock

【问题讨论】:

  • 对我来说最可能的情况是这些是大对象堆中的漏洞,但我实际上想花一些时间来确认您的代码。
  • 请指定 .NET 版本,AFAIK WPF3.5 有一些内存泄漏,已在 WPF4 中修复
  • 我已经检查了 LOH。大约 80MB。我们使用 .net 3.5 SP1(我们无法切换到 .net 4),应用了所有补丁和修复。

标签: c# wpf memory memory-leaks


【解决方案1】:

几点...

您的应用中同时包含本机代码和托管代码,因此请尝试找出哪一半是问题子项。使用托管和本机内存计数器运行 perfmon 以查看问题所在。如果托管计数器和本机计数器都随时间增加,则可能存在泄漏。如果只是本机随着时间的推移而增加,那么本机代码就是罪魁祸首。

我总是使用这 5 个计数器:

  • .NET CLR 内存 | # 总提交字节数
  • .NET CLR 内存 | # 总保留字节数
  • .NET CLR 内存 |大对象堆大小
  • 工艺 |私有字节
  • 工艺 |虚拟字节

另外,还要注意大对象堆的大小​​。您还可以在 WinDbg 中查看这些堆的内容。最后,虽然 LOH 上的对象会随着时间的推移而被垃圾收集,但 LOH 永远不会被压缩,因此 LOH 会随着时间的推移而产生碎片,如果您不小心经常在 LOH 中分配,这会变得很明显。

编辑:我在使用 VMMap 时运气不佳,相反,我主要使用 perfmon 和 WinDbg,有时使用 DebugDiag。

【讨论】:

  • 我实际上运行了这些计数器:> .NET CLR 内存 | # 总提交字节数 357945K > .NET CLR 内存 | # 总保留字节 402554K > .NET CLR 内存 |大对象堆大小 79182K > 进程 |私有字节 1299080K > 进程 | Virtual Bytes 2876524K .NET 保持稳定。虚拟字节增长最快。
【解决方案2】:

如果不查看转储、应用程序或您的代码就很难推测,但是您是否查看过这些:http://msdn.microsoft.com/en-us/magazine/cc163491.aspx

【讨论】:

  • 抱歉但很抽象的建议
  • 对一个没有真正提供任何细节的抽象问题的抽象建议。
  • 如果您希望我执行其他命令,请告诉我,例如在 WinDBG 中并在此处发布结果。
猜你喜欢
  • 2023-03-06
  • 1970-01-01
  • 2011-03-25
  • 1970-01-01
  • 2015-09-16
  • 1970-01-01
  • 2020-02-19
  • 2011-03-08
  • 2013-01-24
相关资源
最近更新 更多