我的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 :(得分:1)
几点......
您的应用中有本机代码和托管代码,因此请尝试找出问题儿童的哪一半。使用托管和本机内存计数器运行perfmon以查看问题所在。如果托管计数器和本机计数器都随着时间的推移而增加,那么您可能会发生泄漏。如果只是本机随着时间的推移而增加,那么本机代码就应该受到责备。
我总是使用这5个计数器:
另外,请注意大对象堆大小。您也可以在WinDbg中查看这些堆的内容。最后,虽然LOH上的物体会随着时间的推移而被垃圾收集,但LOH永远不会被压缩,因此LOH随着时间的推移会出现碎片,如果您不经常在LOH中进行分配,这一点就会变得明显。
编辑:我从来没有幸运过VMMap,而是主要使用perfmon和WinDbg,有时使用DebugDiag。答案 1 :(得分:-1)
如果不仔细查看转储,应用或您的代码,很难推测这些内容:http://msdn.microsoft.com/en-us/magazine/cc163491.aspx