如何在.Net中强制引发OutOfMemoryException异常

5
有时候,让应用程序处于糟糕的状态是有帮助的,这样可以看到它的反应。例如,拔掉网络电缆或断电会显示出我的应用程序有哪些地方需要改进。
为此,我正在尝试找出在.Net中强制引发OutOfMemoryException的最快方法。在简单的控制台应用程序中执行此操作将允许我将此场景注入到正在运行的应用程序中。当处理OutOfMemoryExceptions时,显然还需要考虑其他事情(例如内存碎片化以及垃圾收集器如何分配不同的代),但对于这个实验的范围来说,这并不重要。
更新 为了澄清问题的目的,需要注意的是,仅仅抛出一个内存不足异常是没有帮助的,因为我想看到程序在内存压力增加时的反应。本质上,我想刺激GC进入一种积极的收集模式,并监视它如何影响性能,直到进程死亡并引发内存不足异常。

1
我的一个旧问题可能会引起你的兴趣。 - Scott Chamberlain
一个应用程序在停电情况下能有多强的韧性? - Rotem
1
@rotem 虽然没有百分之百的方法来处理 LossOfPowerException,但是有一些措施可以保护敏感数据(例如不要在客户端缓存关键数据,更频繁地将数据写入存储等)。 - Matt Ruwe
1
在这种情况下,OutOfMemoryException 可能不是最好的模拟场景。杀死 Process 可能更接近实际情况。 - Rotem
2
throw new OutOfMemoryException() - Mr Anderson
显示剩余2条评论
2个回答

4

以下是一个来自MSDN的例子。

下面的示例演示了当试图插入一个字符串时超出对象最大容量而引发OutOfMemoryException异常的情况,该字符串将导致StringBuilder.Insert(Int32, String, Int32)方法的Length属性超出其最大容量。

using System;
using System.Text;

public class Example
{
   public static void Main()
   {
      StringBuilder sb = new StringBuilder(15, 15);
      sb.Append("Substring #1 ");
      try {
         sb.Insert(0, "Substring #2 ", 1);
      }
      catch (OutOfMemoryException e) {
         Console.WriteLine("Out of Memory: {0}", e.Message);
      }
   }
}
// The example displays the following output:
//    Out of Memory: Insufficient memory to continue the execution of the program.

此外,它说明如何纠正错误。

将对StringBuilder.StringBuilder(Int32, Int32) 构造函数的调用替换为调用任何其他的 StringBuilder 构造函数重载。这样,您的 StringBuilder 对象的最大容量将设置为其默认值,即 Int32.MaxValue。

使用足够大的maxCapacity值调用StringBuilder.StringBuilder(Int32, Int32)构造函数,以容纳对StringBuilder对象的任何扩展。


2
根据MSDN

OutOfMemoryException异常有两个主要原因:

  • 您正在尝试扩展一个StringBuilder对象,使其超出StringBuilder.MaxCapacity属性定义的长度。

  • 公共语言运行时无法分配足够的连续内存以成功执行操作。此异常可以由需要内存分配的任何属性分配或方法调用引发。有关OutOfMemoryException异常原因的更多信息,请参见“Out of Memory”不是指物理内存。

    这种类型的OutOfMemoryException异常代表了灾难性的失败。如果选择处理该异常,应包括一个catch块,该块调用Environment.FailFast方法来终止应用程序并向系统事件日志添加条目,就像以下示例一样。

在我看来,第一个与字符串生成器有关的原因会更容易些。

这个可行:

var sb = new StringBuilder(5, 5);
sb.Insert(0, "hello", 2);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接