【问题标题】:ASPX.NET application out of memory exception for no reasonASPX.NET 应用程序无缘无故内存不足异常
【发布时间】:2011-09-01 23:49:21
【问题描述】:

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

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

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

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

【问题讨论】:

  • 对我来说听起来像是一个无限循环。
  • 计算机上没有任何事情发生“无缘无故”。计算机完全按照他们的指示去做,除了硬件故障、杂散的宇宙射线或闪电之外,别无其他。
  • @Mike 只是要写那个:P
  • @Mike Hofer:我猜“没有明显的原因”......今天的太阳活动有点低。更像是不存在的。 @Paul Alan Taylor:PROD 中不会发生无限循环,对吧?

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


【解决方案1】:

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

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

【讨论】:

【解决方案2】:

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

【讨论】:

  • 很好的提示,但我将其设为 0。
【解决方案3】:

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

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

【讨论】:

    猜你喜欢
    • 2021-12-19
    • 1970-01-01
    • 1970-01-01
    • 2015-10-27
    • 2013-09-15
    • 1970-01-01
    • 2015-08-07
    • 2012-11-01
    • 1970-01-01
    相关资源
    最近更新 更多