2012-01-18 96 views
1

我的WPF .net应用程序似乎泄漏内存(我也使用本机和第三方组件)。我进行了一些内存转储,并使用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 
+0

对我来说,最可能的情况是这些是大对象堆中的漏洞,但我真的想花一些时间用你的代码来确认。 – 2012-01-18 17:34:21

+0

请指定.NET版本,AFAIK WPF3.5有一些内存泄漏,在WPF4中修复了 – sll 2012-01-18 17:39:13

+0

我已经检查过LOH。大约80MB。我们使用.net 3.5 SP1(我们无法切换到.net 4),所有修补程序和修复程序都已应用。 – Dunken 2012-01-18 19:07:19

回答

1

的几点...

你有本地和在你的应用程序托管代码,因此要尽量找出哪一半是孩子问题。使用托管和本地内存计数器运行perfmon以查看问题出在哪里。如果托管计数器和本地计数器随着时间的推移而增加,那么您可能会泄漏。如果只是本地的随着时间的推移而增加,那么本机代码就是怪罪。

我总是用这5个柜台:

  • .NET CLR内存| #总提交字节数
  • .NET CLR内存| #总预留字节数
  • .NET CLR内存|大对象堆大小
  • 过程|私人字节
  • 过程|虚拟字节

此外,请注意大对象堆大小以及。您也可以在WinDbg中查看这些堆的内容。最后,虽然LOH上的物品会随着时间的推移而被垃圾收集,但LOH永远不会被压缩,所以LOH会随着时间的推移而变得碎片化,如果您经常意外地在LOH中进行分配,这会变得很明显。

编辑:我从来没有与VMMap运气很好,而是我主要使用perfmon和WinDbg,有时使用DebugDiag。

+0

我实际上已经有了这些计数器: > .NET CLR内存| #总承诺字节数\t 357945K > .NET CLR内存| #总预留字节数\t 402554K >。NET CLR内存|大对象堆大小\t 79182K >过程|专用字节\t \t \t \t 1299080K >过程|虚拟字节\t \t \t \t 2876524K .NET保持稳定。虚拟字节增长最多。 – Dunken 2012-01-18 19:23:07

0

硬而不在转储考虑看看推测,应用程序或代码,但是有你看着这些:http://msdn.microsoft.com/en-us/magazine/cc163491.aspx

+0

对不起,但很抽象的建议 – sll 2012-01-18 18:03:01

+1

抽象的问题,没有提供任何细节的建议。 – Kyberias 2012-01-18 18:51:27

+0

如果您希望我执行其他命令,请让我知道在WinDBG中并在此发布结果。 – Dunken 2012-01-18 19:11:16