谁在使用我的记忆:很多虚拟分配但是小堆

时间:2012-01-18 17:32:23

标签: c# wpf memory memory-leaks

我的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

2 个答案:

答案 0 :(得分:1)

几点......

您的应用中有本机代码和托管代码,因此请尝试找出问题儿童的哪一半。使用托管和本机内存计数器运行perfmon以查看问题所在。如果托管计数器和本机计数器都随着时间的推移而增加,那么您可能会发生泄漏。如果只是本机随着时间的推移而增加,那么本机代码就应该受到责备。

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

  • .NET CLR内存| #Total committed Bytes
  • .NET CLR内存| #Total保留字节
  • .NET CLR内存|大对象堆大小
  • 流程|私人字节
  • 流程|虚拟字节

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

编辑:我从来没有幸运过VMMap,而是主要使用perfmon和WinDbg,有时使用DebugDiag。

答案 1 :(得分:-1)

如果不仔细查看转储,应用或您的代码,很难推测这些内容:http://msdn.microsoft.com/en-us/magazine/cc163491.aspx