ASP.Net:找出OutOfMemoryExpcetions的原因

时间:2010-05-12 14:04:04

标签: asp.net debugging windbg

我试图找出网站的OutOfMemory的原因。这个网站有大约12,000个.aspx页面,最后一次崩溃我使用adplus捕获了一个内存转储。

经过一番调查后我发现了很多堆碎片,大约有100MB的Free块无法分配。挖掘较大的一个大对象堆是碎片化的,原因似乎是字符串实习,如[here] [1]

所述

这可能是由网站中的页数引起的吗?因为他们都是编译的,所以他们坐在记忆中,通过查看转储他们被实习和PINNED,我认为这意味着他们会坚持一段时间。

我觉得这很奇怪,因为有很多网站有更多页面,但动态编译可以解释内存的增长。

还有哪些方法可以找到内存泄漏的原因?我试图在挂起模式下使用adplus捕获转储但是这会失败并且IIS工作进程会被回收。

[1]:•Large Object Heap Fragmentation

2 个答案:

答案 0 :(得分:0)

是否碎片化是其中一个原因,因为“找到”记忆会更加困难。

一些众所周知的线索:

  • 在32位操作系统上,即使您的系统有更多,您的工作进程内存也不能超过2 GB。另一种选择是/ 3GB开关(boot.ini文件)。

  • 当“Process \ Virtual Bytes”在虚拟地址空间限制的600 MB范围内(通常为2 GB)时,遇到OutOfMemoryException的可能性开始急剧增加,其次,测试显示“Process \ Virtual”字节“通常大于”Process \ Private Bytes“不超过600 MB

  • CLR按块分配和处理内存(内存为64 MB;))。这并不意味着它使用所有这些内存,这意味着在使用一个字节之前不会释放一个块,而是内存如何被分割。

  • 当CLR无法分配内存(需要新块),并且它无法进行垃圾收集或寻呼部分内存时,OutOfMemoryException将在最佳情况下发生,否则服务器将被重载最坏的情况。

  • 关于动态编译,这是真的,但最重要的是<compilation debug="false" /> / <deployment retail=”true”/>个开关。他们启用批量编译,这意味着一个DLL按目录(这是另一个点)而不是每个“页面”一个DLL导致虚拟空间碎片。

  • 关于目录的一个DLL,即使是批量编译,你拥有的目录/子目录也多,你将拥有更多的DLL,以及你将拥有的更多零碎的虚拟地址空间。

就个人而言,我使用ANTS Memory Profiler来查找内存问题。

答案 1 :(得分:0)

Tess Ferrandez有一个非常好的博客here,它在开发ASP.NET应用程序时讨论内存问题和其他类型的调试问题。

一个post特别引导您完成教程,看看您是否有泄漏。它使用讨厌的WinDBG,但她解释了所有命令,这样你就可以清楚地了解你的已用内存,并且它可以准确地显示哪些对象正在填充所有空间。

我多次使用她的网站来诊断内存泄漏和其他与性能相关的问题。

我还使用像DebugDiag这样的工具来帮助捕获与内存相关的问题,并使用其内置的诊断工具来帮助发现问题。