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
异常的可能原因是什么
Stream.ReadToEnd()
和DataTable.WriteXml(内存流)
函数
环境是.Net C 35;对以下任何MSIL指令的调用失败时都会发生
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)。在分配失败之前可以访问的实际内存可能会有所不同。