【问题标题】:OutOfMemoryException thrown while memory is still available当内存仍然可用时抛出 OutOfMemoryException
【发布时间】:2010-10-29 01:53:04
【问题描述】:

我需要构建一个大字符串列表并将其保存在内存中,但是在构建它时会引发 OutOfMemoryException。根据资源监视器,我仍然有 1GB 的可用内存。我发现this KB article 解决了这个问题,但它似乎应该在框架 1.1 SP1 中得到修复(我使用的是 3.5 sp1)。

任何人都可以了解幕后发生的事情吗? .net 框架是否限制单个进程(在 32 位系统上)可以使用多少内存?如果是这样,我可以理解原因,但没有意义的是应用程序只使用了 1.6GB,系统还剩下大约 1GB。

编辑 - 对于那些在这里询问的人,这里有一些更深入的信息:

我有一个列表(是的,我可以使用其他东西,但我现在只是在做原型。),我通过执行 Guid.NewGuid().ToString() 生成一个随机字符串,并将其放入列表中.我要做的是生成一个包含尽可能多的项目的列表,并测试查找特定项目的不同方法。我的第一个猜测是一些碎片正在发生,但我放弃了除了下面的代码之外的所有内容,它仍然会发生。我不认为这个小 sn-p 会造成很多碎片,但我可能错了。

        List<string> blah = new List<string>();

        for (int i = 0; i < 50000000; i++)
        {
            blah.Add(Guid.NewGuid().ToString());
        }

【问题讨论】:

  • 您能否提供一个代码 sn-p,说明您遇到 OutOfMemoryException 的位置?
  • 你使用什么数据结构?列表?

标签: .net memory


【解决方案1】:

问题可能不在于您没有“可用”内存,而更可能是您的内存碎片过多,以至于当您尝试将项目添加到列表时,必须调整其大小,没有单个可用内存块可以容纳它。

这也会导致 OutOfMemoryException。

列表有多大,换句话说,当您收到异常时,您在其中有多少个字符串,准确或粗略?

你是如何填充列表的?您是否提前知道要添加的项目数量?如果是这样,您在构建列表时是否指定容量?

如果你不知道,是否有可能弄清楚,所以你可以指定那个容量?

【讨论】:

    【解决方案2】:

    Win32 每个进程的内存限制为 2GB。嗯,实际上是 4GB,但 2GB 是为内核模式保留的,除非你设置了/3GB OS 启动选项。

    【讨论】:

    【解决方案3】:

    List 的默认构造函数以一个空数组作为内部存储开始。调用 Add(T item) 检查是否需要调整数组大小,并将容量属性加倍(通过 EnsureCapacity 方法)。当Capacity属性被设置时...

    1. 创建一个具有新大小的新数组(原来的两倍!)
    2. 将旧元素中的元素复制到新元素中。
    3. 将内部引用更改为新的。

    因此,假设容量为 n 意味着在调整大小期间您的总内存使用量为 3n。

    您的列表失败时包含多少项? 如果您知道将添加多少项,请尝试使用接受容量的构造函数。这避免了可能需要进行的任何调整大小(如果您需要巨大的内存块,可能会直接抛出 OutOfMemoryException)。

    【讨论】:

      【解决方案4】:

      忘记碎片、LargeAddressAware 或 gcAllowVeryLargeObjects... 我的问题通过在我的控制台项目的“属性”页面中的“构建”下取消选中“首选 32 位”复选框来解决。这是默认设置的……为什么?

      【讨论】:

        【解决方案5】:

        我真的不知道这个错误的具体细节,但我确实在几年前遇到过这个问题,或者非常类似的事情。重要的是,我们发现您的应用程序绑定到的 GDI 句柄数量存在硬性限制。大概是 9,999。当您达到此限制时,无论有多少可用内存,应用程序都会因内存不足异常而崩溃。

        所以您可能会做类似的事情,但是由于您提到您正在使用字符串,我想您正在分割堆并超出其容量。如果您的字符串足够大,它们可能在大对象堆上。我认为 LOH 的实现在框架的早期版本中非常糟糕。如果内存正确地为我服务,对象没有被正确地释放,这使得很容易在只有 LOH 上耗尽空间。

        查看这些链接了解更多信息

        http://www.simple-talk.com/dotnet/.net-framework/the-dangers-of-the-large-object-heap/ http://msdn.microsoft.com/en-us/magazine/cc534993.aspx http://blogs.msdn.com/maoni/archive/2006/04/18/large-object-heap.aspx http://social.msdn.microsoft.com/Forums/en-US/clr/thread/08e6bd5f-613e-41ae-9ab1-b05c7ff2710f

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-02-05
          • 1970-01-01
          • 2015-02-28
          • 2014-09-20
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多