C# OutOfMemory异常

C# OutOfMemory异常,c#,out-of-memory,garbage-collection,C#,Out Of Memory,Garbage Collection,OutofMemory异常的可能原因是什么 内存分配应由GC处理 为普通.NET/C应用程序分配/可用的内存量 在我们的应用程序中,它位于不同的位置,如Stream.ReadToEnd()和DataTable.WriteXml(内存流)函数 环境是.Net C 35;对以下任何MSIL指令的调用失败时都会发生 纽奥布 纽瓦尔 盒子 这基本上是在堆中分配新内存的操作,在您的例子中Stream.ReadToEnd显然是在内部分配字节数组以在内存中加载流,因此如果文件足够大,足以中断进程,它将抛出此异

OutofMemory
异常的可能原因是什么

  • 内存分配应由GC处理

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

  • 在我们的应用程序中,它位于不同的位置,如
    Stream.ReadToEnd()
    DataTable.WriteXml(内存流)
    函数

    环境是.Net C 35;

    对以下任何MSIL指令的调用失败时都会发生

  • 纽奥布
  • 纽瓦尔
  • 盒子
  • 这基本上是在堆中分配新内存的操作,在您的例子中Stream.ReadToEnd显然是在内部分配字节数组以在内存中加载流,因此如果文件足够大,足以中断进程,它将抛出此异常

  • 假设你的应用程序中最多可以使用10MB的内存。您可以创建一个新列表,并向其中添加对象实例。现在让我们假设每个对象实例“权重”为1MB。因此,添加前10个实例时不会出现任何问题,但第11个实例将抛出OutOfMemoryException,因为在前10个实例使用了所有分配的内存(10MB)之后

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

  • 如果希望/需要增加应用程序使用的内存,请使用以下vm参数:
    Java youAppName-Xms128m-Xmx512m

    您使用的内存可能比应用程序可用的内存多。在这种情况下,您需要解决如何使内存使用更高效。可能需要使用文件/数据库来存储不立即使用的数据

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


    如果您使用的是C#或.Net,则可以使用CLR事件探查器分析内存,查看内存的使用情况

    您的应用程序已用完可用内存,或者堆碎片有问题

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

    在第二种情况下,即堆碎片,您试图创建一个大于堆中最大连续内存块的对象。这种情况更为罕见,但在某些情况下确实会发生。正常堆将在gc运行期间被压缩,但大型对象堆不会

    关于大型对象堆,MSDN有一个很好的例子


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

    首先,至少要提到您的问题所涉及的环境(如果有)。至少.Net和Java有一个OOM异常。第二,这甚至不是一个恰当的问题。你在问什么?投票结束。1)环境是.Net C#2)为什么这个问题不合适?好吧,问题1)一个问题,但太笼统了,没有真正有意义的答案。2) 这不是一个问题,3)至少应该得到一个问号。请尝试使用正确的标点符号和拼写,最重要的是提供一些上下文。尝试阅读,虽然有点冗长,但它很好地解释了如何提出有意义的问题。值得一读。应用程序有多少可用内存?我如何检查?在32位Windows(Win7之前)上,虚拟内存有2GB的硬限制(使用特定开关时为3GB)。64位Windows可支持8TB(在安腾上为7TB)。在分配失败之前可以访问的实际内存可能会有所不同。