【问题标题】:OutOfMemory exceptionOutOfMemory 异常
【发布时间】:2009-10-26 09:09:47
【问题描述】:
  1. OutofMemory异常的可能原因是什么。

  2. 内存分配应由 GC 处理。

  3. 普通 .NET/C# 应用程序分配/可用的内存量

在我们的应用程序中,它位于不同的地方,例如 Stream.ReadToEnd() 和 DataTable.WriteXml(Memory stream) 函数。

环境是.Net C#

【问题讨论】:

  • 首先,至少提及您的问题所涉及的环境(如果有的话)。至少 .Net 和 Java 有一个 OOM 异常。其次,2)这甚至不是一个适当的问题。你在问什么?投票结束。
  • 1) Envoirment 是 .Net C# 2) 为什么这个问题不合适
  • 嗯,问题 1) 是一个问题,但太笼统以至于没有真正有意义的答案。 2)不是问号,3)至少应该打个问号。请尝试使用正确的标点和拼写,最重要的是给出一些上下文。
  • 尝试阅读catb.org/~esr/faqs/smart-questions.html,虽然有点冗长,但它很好地解释了如何提出有意义的问题。值得一读。

标签: c# out-of-memory garbage-collection


【解决方案1】:

只要对以下任何 MSIL 指令的调用失败,就会出现 OutOfMemory exception

  1. 新对象
  2. 纽华
  3. 盒子

这基本上是在堆中分配新内存的操作,在您的情况下,Stream.ReadToEnd 显然在内部分配字节数组以将流加载到内存中,因此如果文件大到足以破坏进程,它将抛出这个例外。

【讨论】:

    【解决方案2】:

    您使用的内存超出了应用程序可用的内存。在这种情况下,您需要弄清楚如何提高内存使用效率。可能需要使用文件/数据库来存储您不立即使用的数据..

    或者,您有内存泄漏。在这种情况下,您需要考虑在不再使用它们时删除对内存的引用,以便 GC 可以释放内存。

    如果您使用 C# 或 .Net,您可以使用 CLR Profiler 来分析您的内存以了解它是如何使用的。 CLR Profiler

    【讨论】:

    • 应用程序有多少内存可用我如何检查?
    • 在 32 位 Windows(Win7 之前的版本)上,虚拟内存有 2GB 的硬限制(3GB 带有特定开关)。 64 位 Windows 可支持 8TB(Itanic 为 7TB)。在分配失败之前您可以访问的实际内存可能会有所不同。
    【解决方案3】:

    您的应用程序已经用完了可用的内存,或者您遇到了堆碎片问题。

    在第一种情况下,您已经创建了足够的对象来占用所有内存,并且您仍然可以引用它们,因此垃圾收集器无法清理它们。

    在第二种情况下,堆碎片,您试图创建一个大于堆中最大的连续内存块的对象。这种情况比较少见,但在某些情况下肯定会发生。在 gc 运行期间,普通堆会被压缩,但大对象堆不会。

    MSDN 上有一个关于大对象堆的很好的article。

    编辑:我记得另一种摆脱记忆的方法。您可以尝试创建一个大于 2GB 的对象。这是 .NET 中的最大对象大小,即使在 64 位上也是如此。

    【讨论】:

      【解决方案4】:
      1. 假设您的应用程序最多可以使用 10MB 内存。您创建一个新列表并向其中添加对象实例。现在假设每个对象实例“重量”为 1MB。因此,前 10 个实例将毫无问题地添加,但第 11 个实例将抛出 OutOfMemoryException,因为在前 10 个实例之后您使用了所有分配的内存 (10MB)。

      2. 垃圾收集器查找“垃圾”,即不会使用的实例 - 不能使用,因为没有其他实例指向它们。 例如,如果有一个包含实例的 List 类型的实例成员,GC 将不会收集 List 也不会收集它的实例。继续向列表中添加实例可能会出现 OutOfMEmory 异常。

      如果您想要/需要增加应用使用的内存,请使用以下 vm 参数: Java youAppName -Xms128m -Xmx512m

      【讨论】:

        猜你喜欢
        • 2015-07-28
        • 2018-06-18
        • 2015-04-25
        • 2016-04-26
        • 2014-07-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-05-04
        相关资源
        最近更新 更多