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

3

我一直在使用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查询并检索数据。
此外,我的本机堆栈使用也增加了。 我的应用程序有40个本机堆栈。 最后一个堆栈的内存使用量始终在增加。 它的总使用量从67.57 MB增加到1.59 GB再到3.82 GB。 这可能的原因是什么? 这是否与clr的使用有关?

http://blogs.msdn.com/b/paullou/archive/2011/06/28/debugging-managed-code-memory-leak-with-memory-dump-using-windbg.aspx - Hans Passant
1个回答

0

在每个阶段使用

!dumpheap -stat

。您可能能够找到每个阶段增加了哪种类型。对于这些对象,请使用

!gcroot <"addr">

查找持有它以防止垃圾回收的对象。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接