0

这是交易:当我的网络服务器启动时,它会创建几个带有非常小的对象(如 1-2-3 整数)的冗长(20M 元素)数组。任何单个数组的累积大小不大于 2GB(CLR 的限制,请参阅下面的链接了解详细信息)。w3wp.exe 的内存使用量确实增长了接近 2GB(永远不会超过)。该代码在Any CPU平台模式下编译并在具有 8GB RAM 的 Windows 7 x64 上运行。

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

这可能是相关的,但我似乎没有那么大的对象: .Net 中的非常大的集合导致内存不足异常

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

4

3 回答 3

1

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

这篇文章可能包含一些有助于证明这一事实的代码: 如何使用 .NET 检测 Windows 64 位平台?

于 2011-05-25T18:36:38.377 回答
0

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

该分配失败,并且这种情况定义为 OOM,即使可能有大量堆碎片可用。通常,过度使用 linq 会导致这种情况;在某个时刻,延迟执行会失去它的吸引力,您可以通过在战略位置执行一两个“.ToList()”来购买大量性能/资源(根据我的经验,通常接近生成过程的开始,其中大部分数据到达)。

于 2011-05-25T18:08:49.663 回答
0

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

于 2011-05-25T18:23:55.927 回答