【问题标题】:what causes asp.net out of memory exception是什么导致asp.net内存不足异常
【发布时间】:2013-02-18 01:51:29
【问题描述】:

我有一个简单的 asp.net 网站,它将一个大文本文件读入内存并进行一些处理。下面是引发 OOM 异常的代码。在阅读了大约 350k 行之后,我得到了这个错误。每行平均有 1k 个字符。 IIS 或 ASP.Net 网站是否存在内存限制?我的服务器仍然有大量的物理内存。谢谢。

List<string> geos = new List<string>();
using (StreamReader geoReader = new StreamReader(File.OpenRead("file.txt")))
{
    while (geoReader.EndOfStream == false)
    {
        try
        {
            geos.Add(geoReader.ReadLine());
        }
        catch (Exception ex) { }
    }
}

【问题讨论】:

  • 设置 adplus 以在崩溃时捕获内存转储 - 语法类似于:adplus -crash -iis : msdn.microsoft.com/en-us/magazine/cc163833.aspx
  • .NET 中确实存在内存限制。你不能在处理数据之前把数据分成块吗?
  • 你可能会弄乱内存限制,但这是一种脆弱的方法,更大的文件,更多的处理更多的内存对象只会用完它。要看的是你需要内存中的所有数据,然后才能对它做任何事情。 OOM是net进程内存不足,而不是你的机器,实际上它即使在收集之后也无法找到一个连续的空闲内存块
  • 那你用你的清单做什么?如果源文件有大数据,为什么不使用异步操作对每一行执行操作,而不是将其存储在列表中?
  • 无论系统内存如何,如果此操作是为了响应客户端请求,那是一种非常成本高昂的方法。 350 * 1000 * 1000 = 350mb。您是说错误发生在 350,000 行之后,但可能还有更多行?如果 10 个人同时运行同一个请求会发生什么?如果有人厌倦了等待并点击刷新 10 次怎么办? 3.5gig 消失。正如 Alexei 所说,如果您真的需要使用这么多内存,请运行 64 位架构。否则,请考虑重新设计。

标签: c# asp.net out-of-memory streamreader


【解决方案1】:

您的工作进程很可能配置为 32 位 (x86)。在这种情况下,您将至少在大约 2GB 的已分配对象上遇到 OOM,但很可能更早。

如果您确实需要在内存中加载超过 1GB 的对象,请考虑在 64 位进程中运行您的代码。

注意:以上假设您实际上内存不足,而不是尝试一次进行 2GB+ 分配 - 默认情况下会抛出 OOM(据我所知,最新的 .Net 允许更大的分配)。

【讨论】:

    【解决方案2】:

    我在 msdn 上进行了一些搜索,发现了一些可能对您有所帮助的东西。

    有几件事需要考虑:首先,当“Process\Virtual Bytes”在虚拟地址空间限制的 600 MB 以内(通常为 2 GB)时,遇到 OutOfMemoryException 的可能性开始显着增加,其次,测试已经表明“Process\Virtual Bytes”通常比“Process\Private Bytes”大不超过 600 MB。这种差异部分是由于 GC 维护的 MEM_RESERVE 区域,允许它在需要时快速提交更多内存。总之,这意味着当“Process\Private Bytes”超过 800 MB 时,遇到 OutOfMemoryException 的可能性会增加。在此示例中,机器具有 4 GB 的物理 RAM,因此您需要将内存限制设置为 20% 以避免出现内存不足的情况。您可以尝试使用这些数字来最大限度地利用机器上的内存,但如果您想安全地使用它,示例中的数字将起作用。 总而言之,将内存限制设置为物理 RAM 的 60% 或 800 MB 中的较小值。由于 v1.1 支持 3 GB 虚拟地址空间,如果在 boot.ini 中添加 /3GB,则可以安全地使用 1,800 MB 而不是 800 MB 作为上限

    http://msdn.microsoft.com/en-us/library/ms972959

    另一个可能的原因可能是没有安装 Service Pack 1 for .NET Framework 1.1。我猜在没有安装服务包的情况下发生内存异常的可能性更高。

    【讨论】:

      猜你喜欢
      • 2019-08-10
      • 2014-06-07
      • 2012-12-15
      • 2011-05-26
      • 2013-06-22
      • 2013-12-09
      • 1970-01-01
      • 1970-01-01
      • 2014-03-11
      相关资源
      最近更新 更多