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位的功能
按分配大小排名前4位的功能
有趣的日志发现:
功能细节
Function mscorwks!EEVirtualAlloc+15b
Function mscorwks!EEHeapAlloc+15b
Function mscorwks!CExecutionEngine::CheckThreadState+fe
Function mscorwks!CLRMapViewOfFileEx+4a
我希望有人向我推进正确的方向如何从这个转储中发现内存泄漏?我能够将dump装入windbg并运行标准的windbg命令集,但我不知道哪一个是能够隔离泄漏的正确命令.
如果有人想帮助我,我可以提供完全转储.
| 归档时间: |
|
| 查看次数: |
2504 次 |
| 最近记录: |