.net framework中如何解决OutOfMemoryExceptions

遇到了问题:
当你在使用ASP.NET开发应用程序是碰到了OutOfMemoryExceptions.
起因:
参看下文分析。。。
解决方案:
使用Windbg查看托管堆。

是否是内存泄漏? 首先使用Perfmon工具来查看内存程序的内存使用情况。如果内存在缓慢的增长并且一直都没有被释放,那就是内存泄漏。如果内存像过山车一样的突然拔地而起又突然回落到正常水平,那说明你的程序中使用了巨消耗内存的对象或操作,但是最终还是被GC给回收了。
如何排查?
下面我们来一步一步试验如何排查类似的情况。
1. 获取内存的转储(Memory dump)
这一步可以使用Windbg或者Adplus来完成。如果你没有安装Windbg, 建议你先查看Johan Steve的文章How to install Windbg and get your first memory dump.
2. 打开转储文件,加载SOS
使用Windbg打开dump文件,并且加载SOS扩展。 如果你的程序使用的是.net framework 2.0,看看文件夹"C:\Windows\Microsoft.NET\Framework\v2.0.50727"是否存在. 然后输入:
.load [path]\SOS
来加载SOS。
3. 运行dumpheap命令
执行这个命令:!dumpheap –stat
这个命令会统计托管堆上的所有对象,并且以容易看明白的排版形式显示出来。内容包含:
1. 对象的方法表。
2. 对象类型在托管堆上包含其他对象的数量。
3. 以byte为单位所列出对象的总的大小。
4. 对象的类型名。
当心不要忘了参数-stat。如果忘了的话Windbg将会在你的屏幕上密密麻麻的打印出托管堆中每一个对象的地址,那些数据绝大多数都是我们不需要的。
下面我们来看看!dumpheap打印出来的信息有何玄机
来看一个例子:
1: 0:000> !dumpheap -stat
2: Statistics:
3: MT Count TotalSize Class Name
4: 7a787cc4 1 12 System.IO.FileSystemWatcher+FSWAsyncResult
5: 7a75904c 1 12 System.Diagnostics.OrdinalCaseInsensitiveComparer
6: 7a7575cc 1 12 System.CodeDom.Compiler.CodeDomConfigurationHandler
7: 7a7571a8 1 12 System.Net.DefaultCertPolicy
8: 7a75661c 1 12 System.Diagnostics.TraceListenerCollection
9: 7a755834 1 12 System.Diagnostics.PerformanceCounterCategoryType
10: ........CONTINUED.........
11: 68a66a88 227,559 12,743,304 System.Web.UI.WebControls.Literal
12: 68a2f7fc 399,272 14,373,792 System.Web.UI.ControlCollection
13: 68a92e2c 768,731 33,824,164 System.Web.UI.Control+OccasionalFields
14: 68a884a0 641,952 38,517,120 System.Web.UI.LiteralControl
15: 79124228 879,515 43,394,976 System.Object[]
16: 790fa3e0 1,431,594 122,806,484 System.String
17:
18: Total 10,389,625 objects, Total size: 463,313,540
Tags: 

延伸阅读

最新评论

发表评论