C# 谁在使用我的内存:大量虚拟分配,但堆很小
我的WPF.net应用程序似乎泄漏了内存,我还使用本机和第三方组件。我用DebugDiag、WinDBG和VMMap分析了一些内存转储。我已经看到托管堆以及本机堆和线程在较低级别上相当稳定。然后我用DebugDiag做了一个分析。它表明,到目前为止,大部分是通过虚拟分配2.5GB进行分配的:1.2GB已提交,1.2GB保留 VMMap显示我的大部分内存要么是私有数据,要么是在一个转储偶数页表中。。。我怎么知道是谁干的???我本以为托管堆或本机堆会增长 编辑让我添加一些其他计数器:C# 谁在使用我的内存:大量虚拟分配,但堆很小,c#,wpf,memory,memory-leaks,C#,Wpf,Memory,Memory Leaks,我的WPF.net应用程序似乎泄漏了内存,我还使用本机和第三方组件。我用DebugDiag、WinDBG和VMMap分析了一些内存转储。我已经看到托管堆以及本机堆和线程在较低级别上相当稳定。然后我用DebugDiag做了一个分析。它表明,到目前为止,大部分是通过虚拟分配2.5GB进行分配的:1.2GB已提交,1.2GB保留 VMMap显示我的大部分内存要么是私有数据,要么是在一个转储偶数页表中。。。我怎么知道是谁干的???我本以为托管堆或本机堆会增长 编辑让我添加一些其他计数器: .NET CL
.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
如果不查看转储、应用程序或您的代码,很难进行推测,但是您是否已经查看了这些内容:几点 您的应用程序中既有本机代码,也有托管代码,因此请尝试找出哪一半是问题儿童。使用托管和本机内存计数器运行perfmon以查看问题所在。如果托管计数器和本机计数器都随时间增加,则可能存在泄漏。如果只是本机代码随着时间的推移而增加,那么本机代码就是罪魁祸首 我总是使用以下5个计数器: .NET CLR内存|提交的总字节数 .NET CLR内存|总保留字节数 .NET CLR内存|大对象堆大小 进程|专用字节 进程|虚拟字节 另外,还要注意大的对象堆大小。您还可以在WinDbg中查看这些堆的内容。最后,虽然LOH上的对象会随着时间的推移而被垃圾收集,但LOH永远不会被压缩,因此LOH会随着时间的推移而变得碎片化,如果您不小心太频繁地在LOH中分配,这一点会变得很明显
编辑:我对VMMap从来没有太多的运气,相反,我主要使用perfmon和WinDbg,有时使用DebugDiag。对我来说,最可能的情况是这些都是大型对象堆中的漏洞,但我想实际花一些时间与您的代码确认一下。请指定.NET版本,AFAIK WPF3.5有一些内存泄漏,这些泄漏已在WPF4I中修复,并且已检查LOH。大约80MB。我们使用.net 3.5 SP1我们无法切换到.net 4,已应用所有修补程序和修复程序。很抱歉,对于一个没有提供任何详细信息的抽象问题,提供了非常抽象的建议。如果您希望我执行其他命令(例如在WinDBG中)并将结果发布到此处,请告知我。实际上,我已经让这些计数器运行:>.NET CLR Memory | Total committed Bytes 357945K>.NETCLR内存|总保留字节402554K>.NET CLR内存|大对象堆大小79182K>进程|专用字节1299080K>进程|虚拟字节2876524K.NET保持稳定。虚拟字节增长最快。