mscorwks中的非托管内存泄漏有助于分析

psu*_*lek 6 c# memory-leaks windbg

故事:

我们在.NET 2.0应用程序中面临非托管内存泄漏.启动后的进程消耗大约150MB(大部分是.NET托管,对象状态等).经过大约12个小时的运行过程消耗高达800MB,在接下来的12个小时后,进程大约有1.8GB的RAM.我刚试过JetBrains .NET内存分析器,ANTS,.NET内存分析器(以及市场上可能有的2个下一个内存配置文件)这些都没有帮助我,因为我后来检测到我们的进程消耗了非托管区域中未管理的大量内存.为了检测这一点,我使用了具有计数器的Perf监视器:私有字节(进程)和所有堆中的#字节(.NET CLR内存),其中专用字节消耗了进程分配的所有内存的大约90%.这就是我切换到非托管调试的原因.

DebugDiag:所以我在进程上运行debugdiag并获得完全转储,这里是它的快照:

  • mscorwks.dll(一个已知的Windows内存管理器)负责781,73 MB的未完成分配.这些分配似乎源自以下模块和功能:

  • ntdll.dll(一个已知的Windows内存管理器)负责98,24 MB的未完成分配.这些分配似乎源自以下模块和功能:

按分配计数排名前4位的功能

  • mscorwks!EEHeapAlloc + 15b - 80 957分配
  • mscorwks!CLRMapViewOfFileEx + 4a - 4 171分配

按分配大小排名前4位的功能

  • mscorwks!EEVirtualAlloc + 15b - 117,50 MBytes
  • mscorwks!EEHeapAlloc + 15b - 15,03 MBytes

有趣的日志发现:

功能细节

Function mscorwks!EEVirtualAlloc+15b

  • 分配类型虚拟内存分配
  • 分配计数1471分配
  • 分配大小117,50 MBytes
  • 泄漏概率73%

Function mscorwks!EEHeapAlloc+15b

  • 分配类型堆分配
  • 分配计数80957分配
  • 分配大小15,03 MBytes
  • 泄漏概率72%

Function mscorwks!CExecutionEngine::CheckThreadState+fe

  • 分配类型堆分配
  • 堆处理0x00000000`00000000
  • 分配计数2分配
  • 分配大小304字节
  • 泄漏概率98%

Function mscorwks!CLRMapViewOfFileEx+4a

  • 分配类型虚拟内存分配
  • 分配计数4171分配
  • 分配大小0字节
  • 泄漏概率73%

我希望有人向我推进正确的方向如何从这个转储中发现内存泄漏?我能够将dump装入windbg并运行标准的windbg命令集,但我不知道哪一个是能够隔离泄漏的正确命令.

如果有人想帮助我,我可以提供完全转储.

Bri*_*sen 3

查看转储文件,它似乎确实是托管泄漏,只是不在托管堆上。转储显示托管堆非常小,但加载器堆为 1 GB。该流程有超过 35000 个动态程序集。我查看了其中一些,它们似乎是序列化的(XML 和二进制)。看看这篇博文。它描述了一个类似的问题。