Ash*_*son 6 .net c# memory profiling
这是迄今为止我构建的最复杂的软件,现在它似乎在某些时候耗尽了内存.我还没有进行过广泛的测试,因为我有点迷失了我应该如何解决手头的问题.
HandleCount: 277
NonpagedSystemMemorySize: 48136
PagedMemorySize: 1898590208
PagedSystemMemorySize: 189036
PeakPagedMemorySize: 1938321408
VirtualMemorySize: 2016473088
PeakVirtualMemory: 2053062656
WorkingSet: 177774592
PeakWorkingSet: 883834880
PrivateMemorySize: 1898590208
PriviligedProcessorTime: 00:00:15.8593750
UserProcessorTime: 00:00:01.6562500
TotalProcessorTime: 00:00:17.5156250
GDI Objects: 30
User Objects: 27
Run Code Online (Sandbox Code Playgroud)
我有一个自动化的全局异常捕获器,在异常时收集上述信息(使用System.Diagnostics.Process) - 以及异常信息,日志和屏幕截图 - 并通过电子邮件发送给我所有内容.
这已经很好地工作了,因为我已经能够根据电子邮件信息插入错误.到目前为止,这是.该软件有数万行,并使用托管和非托管资源.
我可以逐行开始编写代码,但有些我觉得这可能不是尝试推断内存构建问题的最佳方法.
由于我以前从未做过这种分析,你会如何建议解决这类问题?
Eri*_*ert 10
我们提供了一个工具.
http://msdn.microsoft.com/en-us/library/ms979205.aspx
CLR Profiler使您可以查看进程的托管堆并调查垃圾收集器的行为.使用该工具中的各种视图,您可以获得有关应用程序的执行,分配和内存消耗的有用信息.
使用CLR Profiler,您可以识别分配太多内存,导致过多垃圾收集以及保留内存太久的代码.
有几种选择.专用内存分析器(如RedGate的ANTS Memory Profiler)对于解决此类问题非常有用.
如果您不想在专用工具上花钱,您还可以使用WinDbg(Windows的调试工具的一部分,可从Microsoft免费下载).它可以显示托管堆的堆使用情况,各种AppDomain堆等等.
看看这篇博客,了解使用WinDbg的提示.
请记住,排除内存不足可能很困难,因为您通常不会看到实际问题而只是一个症状.因此,与调用堆栈将为您提供问题根源的非常好的指示的崩溃不同,具有OOM的进程的调用堆栈可能显示很少.
根据我的经验,你必须看看使用内存的地方.它可能位于托管堆上,在这种情况下,您必须查明某些内容是否持有的时间超过了必要的时间.但是,它也可能与加载大量组件(通常是动态生成的组件)有关.