.NET - clr.dll和本机堆的高内存使用率

时间:2013-09-12 05:29:35

标签: .net memory-leaks windbg heap-memory

我一直在使用DebugDiag对.NET应用程序执行内存泄漏分析,该应用程序的内存不断增加。

经过几次测试转储,然后在一天内捕获转储,我看到模块clr.dll在第一次转储中有5.08 MB的分配,在第二次转储中有286.4 MB的分配,在第三次转储中有609.56 MB的分配。

具体而言,上升是由clr!DoNDirectCall__PatchGetThreadCall+7b引起的分配,其中首先分配894.33 KB,第二分配280.85 MB,第三分配601.13 MB。以下是第三个转储中的一些调用堆栈 -

Call stack sample 1

Address   0x00730074`00210048 
Allocation Time   00:09:03 since tracking started 
Allocation Size   34 Bytes 


Function   Source   Destination 
clr!DoNDirectCall__PatchGetThreadCall+7b       
mscorlib_ni+b9597b       
mscorlib_ni+b940ed       
mscorlib_ni+b9513e       
System_Management_ni+dc561       
System_Management_ni+aa364       
System_Management_ni+e4616       

Call stack sample 2

Address   0x00730074`00210048 
Allocation Time   00:05:00 since tracking started 
Allocation Size   34 Bytes 


Function   Source   Destination 
clr!DoNDirectCall__PatchGetThreadCall+7b       
mscorlib_ni+9bb2cc       
mscorlib_ni+b934aa       
System_Management_ni+dc714       
System_Management_ni+acb99       
System_Management_ni+e41a5       


Call stack sample 3

Address   0x00730074`00210048 
Allocation Time   00:05:00 since tracking started 
Allocation Size   34 Bytes 


Function   Source   Destination 
clr!DoNDirectCall__PatchGetThreadCall+7b       
mscorlib_ni+9bb2cc       
mscorlib_ni+b934aa       
System_Management_ni+dc714       
System_Management_ni+acb99       
System_Management_ni+e41a5       
0x6448017AE50    

导致这种情况的原因是什么?如何找到更多相关信息?

此外,我的代码使用可用的C#方法来运行远程WMI查询并检索该数据。

此外,我的Native Heaps使用率也会增加。我的应用程序有40个本机堆。最后一个堆的内存使用量总是增加。其总使用量从67.57 MB到1.59 GB到3.82 GB。可能是什么原因,这与clr的使用有关吗?

1 个答案:

答案 0 :(得分:0)

使用

  

!dumpheap -stat

在每个阶段。您可以在每个阶段找到大幅增加的类型。在那些对象上使用

  

!gcroot   < “地址” >

找到哪个对象阻止垃圾收集。