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 查询并检索该数据。

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

4

1 回答 1

0

利用

!dumpheap -stat

在每个阶段。您可能会发现在每个阶段哪种类型正在急剧增加。在这些对象上使用

!gcroot <"地址">

从垃圾收集中找出哪个对象持有它。

于 2014-03-02T16:17:34.300 回答