5
  1. OutofMemory异常的可能原因是什么。

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

  3. 为正常的 .NET/C# 应用程序分配/可用的内存量

在我们的应用程序中,它出现在不同的地方,例如Stream.ReadToEnd()DataTable.WriteXml(Memory stream)功能。

环境是.Net C#

4

4 回答 4

7

只要对以下任何 MSIL 指令的调用失败,就会发生OutOfMemory异常

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

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

于 2009-10-26T09:15:21.037 回答
2

Either your application has used up the memory available to it or you have a problem with heap fragmentation.

In the first case you have created enough objects to take up all of the memory and you still have reference to them so the garbage collector cannot clean them up.

In the second case, heap fragmentation, you are trying to create an object that is bigger than the largest contiguous chunk of memory in the heap. This is more rare but certainly happens in some cases. The normal heap will get compacted during gc runs but the large object heap will not.

There is a good article on MSDN about the large object heap.

Edit: I remembered another way to get out of memory. You can try and create an object that is larger than 2GB in size. That is the maximum object size in .NET even on 64-bit.

于 2009-10-26T10:14:44.570 回答
2

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

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

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

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

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

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

于 2009-10-26T09:29:11.783 回答