2016-08-19 16 views
4

アプリケーションを悪い状況に陥り、それがどのように応答するかを確認することが役立つことがあります。ネットワークケーブルを抜いたり、電源を切ったりすると、アプリケーションがどれぐらいの反発力を発揮しているか、作業がどこにあるかがわかります。.NETでOutOfMemoryExceptionを強制的に実行する方法

この目的のために、私はOutOfMemoryExceptionを.Netに強制する最も速い方法を見つけようとしています。これを単純なコンソールアプリケーションで実行すると、このシナリオを実行中のアプリケーションに注入できます。 OutOfMemoryExceptions(メモリの断片化やガベージコレクタが異なる世代をどのように割り当てたかなど)を扱う際に考慮する必要があることは明らかですが、この実験の範囲では重要ではありません。

更新
は質問の目的を明確にするために、それは私がメモリの圧力が上昇したときにプログラムがどう反応するか見たいと思っているので、単純にメモリ不足の例外のうちをスローすることは有益ではないことに注意することが重要です。本質的には、GCを積極的な収集モードにして、メモリ不足の例外からプロセスがなくなるまでパフォーマンスにどのように影響するかを監視したいと考えています。 MSDNによると

+1

[私の古い質問](http://stackoverflow.com/questions/6977218/parallel-foreach-can-cause-a-out-of-memory-exception-if-working-with-a -enumera)はあなたに興味があるかもしれません。 –

+0

どのように復元力がアプリに電力損失をもたらす可能性がありますか? – Rotem

+0

http://stackoverflow.com/questions/15595061/outofmemoryexception-while-populating-emorystream-256mb-allocation-on-16gb-sys –

答えて

4

一例from MSDN ..

次の例では、StringBuilder.Insert(のInt32、文字列の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オブジェクトへの展開に対応するために十分な大きさのmaxCapacity値を持つStringBuilder.StringBuilder(Int32、Int32)コンストラクタを呼び出します。

2

アンのOutOfMemoryException例外は、2つの主要な原因があります。

  • あなたは、そのStringBuilder.MaxCapacityプロパティによって定義された長さを超えてStringBuilderオブジェクトを拡張しようとしています。

  • 共通言語ランタイムは、操作を正常に実行するために十分な連続したメモリを割り当てることができません。この例外は、 のメモリ割り当てを必要とするプロパティの割り当てまたはメソッド呼び出しによってスローされ、 になる可能性があります。 OutOfMemoryException例外の原因の詳細については、「メモリ不足」が 物理メモリを参照していないを参照してください。

    このタイプのOutOfMemoryException例外は、致命的な障害を表します。例外を処理することを選択した場合、 には、Environment.FailFast メソッドを呼び出すcatchブロックが含まれている必要があります。次の例のように、アプリケーションを終了し、システムイベントログにエントリを追加します。

文字列ビルダを持つ最初のものは容易になるだろう私には思えます。

これは動作します。

var sb = new StringBuilder(5, 5); 
sb.Insert(0, "hello", 2); 
関連する問題