有时将应用程序置于不良状态以查看其响应方式会很有帮助。拔掉网线或断电等事情将向我展示我的应用程序的弹性以及我可以做的工作。
为此,我试图找出在.Net中强制OutOfMemoryException
的最快方法。在简单的控制台应用程序中执行此操作将允许我将此方案注入正在运行的应用程序中。在处理OutOfMemoryExceptions
时,显然还需要考虑其他事项(例如内存碎片以及垃圾收集器如何分配不同代)但这对于本实验的范围并不重要。
更新
为了澄清问题的目的,重要的是要注意简单地抛出一个内存不足的例外是没有用的,因为我想知道当内存压力增加时程序将如何反应。从本质上讲,我希望将GC激发到积极的收集模式,并监控这会如何影响性能,直到该过程因内存不足异常而消失。
答案 0 :(得分:4)
一个例子from MSDN ..
以下示例说明了当示例尝试插入会导致对象的Length属性超过其最大容量的字符串时,调用StringBuilder.Insert(Int32,String,Int32)方法引发的OutOfMemoryException异常
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.StringBuilder(Int32,Int32)构造函数的调用。 StringBuilder对象的最大容量将设置为其默认值,即Int32.MaxValue。
使用maxCapacity值调用StringBuilder.StringBuilder(Int32,Int32)构造函数,该值足以容纳StringBuilder对象的任何扩展。
答案 1 :(得分:2)
根据MSDN:
OutOfMemoryException异常有两个主要原因:
您正在尝试将StringBuilder对象扩展到其StringBuilder.MaxCapacity属性定义的长度之外。
公共语言运行库无法分配足够的连续内存来成功执行操作。这个例外可以 由任何需要a的属性赋值或方法调用抛出 内存分配。有关原因的更多信息 OutOfMemoryException异常,请参阅“内存不足” 物理记忆。
这种类型的OutOfMemoryException异常表示灾难性故障。如果您选择处理异常,那么您 应该包含一个调用Environment.FailFast的catch块 终止应用程序并向系统事件日志添加条目的方法, 如下例所示。
在我看来,第一个使用字符串构建器会更容易。
这有效:
var sb = new StringBuilder(5, 5);
sb.Insert(0, "hello", 2);