.NET FrameworkはOutOfMemoryExceptionにメモリをどのように割り当てますか?


144

C ++では、ヒープにメモリを割り当てなくても、値によって例外をスローすることが実際に可能であるため、この状況は理にかなっています。ただし、.NETフレームワークOutOfMemoryExceptionは参照型であるため、ヒープに割り当てられます。OutOfMemoryException新しいオブジェクトを作成するのに十分なメモリがない場合、.NET Frameworkはどのようにメモリを割り当てますか?


6
すばらしい質問です。たぶん、そのような状況のために十分なメモリが予約されています。
GreatAndPowerfulOz 2015年

19
ここですでに他の回答に追加するために、OOMは要求したブロックを割り当てることができないことを意味することに注意してください。100Mbを要求し、ランタイムが検出できる最大のブロックが99Mbのみの場合、失敗します。しかし、OOM例外は数バイトのメモリしか必要としません。つまり、割り当てが失敗したからといって、メモリが残っているわけではありません。しかしもちろん、ランタイムがこの状況でそれ自体をカバーするためにいくつかのメモリを予約している可能性があります
Jason Williams

4
ところで、C ++についてのあなたの仮定は正しくありません。コンパイラによっては、例外がヒープに割り当てられる場合があります。MSコンパイラーはそうではありませんが、Common C ++ ABIでは、ヒープにスペースが残っていない場合に代わりに使用される小さな事前割り当て緊急バッファーがあることを除いて、例外はヒープに割り当てられます。
Sebastian Redl、2015年

回答:


163

ランタイムによって事前に割り当てられます。管理対象プロセスのヒープを調べると、その例外のインスタンスが見つかります。

Hello Worldアプリの事前割り当て済みの例外は次のとおりです。

0:003> !dumpheap -stat -type Exception
Statistics:
      MT    Count    TotalSize Class Name
735f2920        1           84 System.ExecutionEngineException
735f28dc        1           84 System.StackOverflowException
735f2898        1           84 System.OutOfMemoryException
735f2744        1           84 System.Exception
735f2964        2          168 System.Threading.ThreadAbortException

4
しかしのコンストラクタOutOfMemoryExceptionが呼び出されます。
Tim Schmelter、2015年

36
ランタイムは、コードと同じルールで再生する必要はありません。もう1つの例は、スローStackOverflowExceptionするとキャッチできるが、ランタイムがその例外をスローすると(デフォルトでは)キャッチできないことです。
Brian Rasmussen

8
CLRの基本的なメカニズムの多くは、実際には「C」と「C ++」で記述されています。したがって、オブジェクトが「所定の場所に新しく」あるか、メモリが他の方法で操作されている可能性があります。
GreatAndPowerfulOz 2015年

2
@hvd副作用は何ですか?OOMはスタックトレースを提供しますか?残りの情報はかなり静的ですが、私は持っているでしょうか?
James Barrass、2015年

7
2つのスレッドが同時に例外をスローするため、同じタイプの例外が2つ必要な場合はどうなりますか?
Traubenfuchs、2015年

42

ランタイム内でメモリ不足状態が発生すると、ThrowOutOfMemory呼び出されます。これはException :: GetOOMExceptionを呼び出します。これは、スタック上にオブジェクトを作成し、それを静的に割り当てられたグローバルインスタンスにコピーしてからスローします。

これはマネージ例外ではありませんが、ex.hで宣言されたC ++例外です。C ++例外はclrex.cppでマネージ例外に変換されます。これには、最初に割り当てられ、appdomain.cppで構築された、事前に割り当てられたマネージ OutOfMemoryException を具体的にスローするコードが含まれます。

注:これらのソースファイルの一部はサイズが大きく、構文の強調表示を読み込む間、ブラウザが数秒間ハングする場合があります。

Tim Schmelterが他の回答のコメントでリンクした呼び出しサイトは、ランタイムがメモリ不足になり、オブジェクトを構築できないことに関連していません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.