「OutofMemory」例外の .dmp ファイルを分析しています。オブジェクトは非常に長い間メモリ内に留まっているため、SOS.dll または SOSEX を使用してガベージ コレクションがトリガーされたかどうかを確認するコマンドはありますか?
1 に答える
あなたが言及したコメントで
ダンプを見ると、特定のオブジェクトがジェネレーション 2 にとどまり、ほぼ 500 MB 以上を占めていることがわかります。そのため、ガベージ コレクションが実行されたかどうかを確認したかったのです。
Gen 2 のオブジェクトがある場合、ガベージ コレクションは少なくとも 2 回実行され、それ以外の場合は Gen 0 になります。
これでわかったので、この情報があまり役に立たないことは明らかです。記憶に残る理由を知りたい。
どの参照がラージ オブジェクトをメモリに保持しているかを調べるには、SOS コマンドを使用します!gcroot
。それがわかったら、コードを見直して、そのような参照がどこから来ているのか、どこから削除する必要があるのかを調べてください。
参照がなくなった場合、オブジェクトはすぐに解放される可能性があります。それ以降、Gen 2 ガベージ コレクションが発生していないため、オブジェクトは生きているだけです。大きなオブジェクトを解放するポイントについて説明している IDisposable に関するこの素晴らしい回答を参照してください。
あなたの場合、参照を解放した後に呼び出しても問題ないかもしれません。GC.Collect()
通常、ガベージ コレクションを改ざんするべきではありませんが、常にそのような大きなオブジェクトがあり、このオブジェクトが不要でありGC.Collect()
、OOM 例外を解決することが確実にわかっている場合は、それを行うのが正しいことです。