ASPX.NET应用程序出于内存异常无缘无故

时间:2011-05-25 17:58:02

标签: c# .net webserver out-of-memory large-data

这是交易:当我的Web服务器启动时,它会创建一些冗长的(20M元素)数组,其中包含非常小的对象(如1-2-3整数)。任何单个数组的累积大小不大于2GB(CLR的限制,请参阅下面的链接了解一些细节)。 w3wp.exe的内存使用量增长接近2GB(从不超过2GB)。代码在Any CPU平台模式下编译,在Windows 7 x64上以8GB RAM运行。

在创建列表时,究竟是什么让它抛出OutOfMemoryException?如果我通过IIS或VS托管进程会有什么不同吗?这似乎没有发生PROD,但我一直在我的开发机器上遇到这种情况。 (现在尝试重启......)

这可能是相关的,但我似乎没有那么大的对象: Very large collection in .Net causes out-of-memory exception

编辑: 在IIS或VS中运行确实有所不同 - 在IIS中启动进程时看不到这种情况。那可能是VS调试器限制吗?

3 个答案:

答案 0 :(得分:1)

根据您更新的问题,很明显Visual Studio不能以64位模式运行。所以在Visual Studio下你的限制是2GB。

这篇文章可能包含一些有助于证明这一事实的代码: How to detect Windows 64-bit platform with .NET?

答案 1 :(得分:0)

可能没有优化内存分配(即以小步骤完成并调整大小)。这有可能使堆碎片化,使得有条件的可用空间不再存储“半大”数组。

分配失败,这种情况按照定义OOM,即使堆的大量片段可用。通常,过度使用linq会导致这种情况;在某一点延迟执行会失去它的吸引力,你可以通过在战略位置做一两个'.ToList()'来购买大量的性能/资源(根据我的经验,通常接近你的生成过程的开始,大部分数据到货。)

答案 2 :(得分:0)

检查您是否将apppool回收阈值设置为2GB http://technet.microsoft.com/en-us/library/cc732519%28WS.10%29.aspx