【问题标题】:How to force an OutOfMemoryException in .Net如何在 .Net 中强制出现 OutOfMemoryException
【发布时间】:2016-12-27 00:31:21
【问题描述】:

有时,让应用程序陷入糟糕的境地,看看它是如何响应的,这很有帮助。拔掉网线或拔掉电源之类的事情将向我展示我的应用程序的弹性以及我还有哪些工作要做。

为此,我试图找出在.Net 中强制OutOfMemoryException 的最快方法。在一个简单的控制台应用程序中执行此操作将允许我将此场景注入到正在运行的应用程序中。在处理OutOfMemoryExceptions 时显然还需要考虑其他一些事情(例如内存碎片以及垃圾收集器如何分配不同的代),但这对于本实验的范围并不重要。

更新
为了澄清问题的目的,重要的是要注意简单地抛出内存不足异常是没有帮助的,因为我想看看当内存压力增加时程序将如何反应。本质上,我想将 GC 激发到积极的收集模式,并监控这对性能的影响,直到进程因内存不足异常而死。

【问题讨论】:

  • 您可能对old question of mine 感兴趣。
  • 应用程序对断电的恢复能力如何?
  • @rotem 虽然没有万无一失的方法来处理 LossOfPowerException,但您可以采取一些措施来保护敏感数据(例如,不在客户端中缓存关键数据,更频繁地将数据写入存储等)
  • @MattRuwe 在这种情况下,OutOfMemoryException 可能不是该场景的最佳模拟。杀死Process 可能更接近。
  • throw new OutOfMemoryException()

标签: .net


【解决方案1】:

一个例子from MSDN..

以下示例说明了调用 StringBuilder.Insert(Int32, String, Int32) 方法引发的 OutOfMemoryException 异常,当示例尝试插入会导致对象的 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。

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

【讨论】:

    【解决方案2】:

    根据MSDN

    OutOfMemoryException 异常有两个主要原因:

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

    • 公共语言运行时无法分配足够的连续内存来成功执行操作。这个例外可以 由任何需要 内存分配。欲了解更多有关原因的信息 OutOfMemoryException 异常,见“内存不足” 不指 物理内存。

      这种类型的 OutOfMemoryException 异常表示灾难性故障。如果您选择处理异常,您 应该包含一个调用 Environment.FailFast 的 catch 块 终止您的应用程序并向系统事件日志添加条目的方法, 如下例所示。

    在我看来,第一个使用字符串生成器会更容易。

    这行得通:

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

    【讨论】:

      猜你喜欢
      • 2015-11-28
      • 2012-03-25
      • 1970-01-01
      • 2011-05-14
      • 1970-01-01
      • 2016-05-15
      • 2013-06-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多