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

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

具体来说,上升是由clr!DoNDirectCall__PatchGetThreadCall+7b引起的分配,clr首先具有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。这可能是什么原因,这与ojit_code的用法有关吗?

最佳答案



!dumpheap -stat

在每个阶段。您可能能够找到在每个阶段急剧增加的类型。在那些对象上使用

!gcroot


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

07-28 03:06
查看更多