Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 谁在使用我的内存:大量虚拟分配,但堆很小_C#_Wpf_Memory_Memory Leaks - Fatal编程技术网

C# 谁在使用我的内存:大量虚拟分配,但堆很小

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

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

如果不查看转储、应用程序或您的代码,很难进行推测,但是您是否已经查看了这些内容:

几点

您的应用程序中既有本机代码,也有托管代码,因此请尝试找出哪一半是问题儿童。使用托管和本机内存计数器运行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保持稳定。虚拟字节增长最快。