0

「OutofMemory」例外の .dmp ファイルを分析しています。オブジェクトは非常に長い間メモリ内に留まっているため、SOS.dll または SOSEX を使用してガベージ コレクションがトリガーされたかどうかを確認するコマンドはありますか?

4

1 に答える 1

0

あなたが言及したコメントで

ダンプを見ると、特定のオブジェクトがジェネレーション 2 にとどまり、ほぼ 500 MB 以上を占めていることがわかります。そのため、ガベージ コレクションが実行されたかどうかを確認したかったのです。

Gen 2 のオブジェクトがある場合、ガベージ コレクションは少なくとも 2 回実行され、それ以外の場合は Gen 0 になります。

これでわかったので、この情報があまり役に立たないことは明らかです。記憶に残る理由を知りたい。

どの参照がラージ オブジェクトをメモリに保持しているかを調べるには、SOS コマンドを使用します!gcroot。それがわかったら、コードを見直して、そのような参照がどこから来ているのか、どこから削除する必要があるのか​​を調べてください。

参照がなくなった場合、オブジェクトはすぐに解放される可能性があります。それ以降、Gen 2 ガベージ コレクションが発生していないため、オブジェクトは生きているだけです。大きなオブジェクトを解放するポイントについて説明している IDisposable に関するこの素晴らしい回答を参照してください。

あなたの場合、参照を解放した後に呼び出しても問題ないかもしれません。GC.Collect()通常、ガベージ コレクションを改ざんするべきではありませんが、常にそのような大きなオブジェクトがあり、このオブジェクトが不要でありGC.Collect()、OOM 例外を解決することが確実にわかっている場合は、それを行うのが正しいことです。

于 2015-10-16T12:45:04.147 に答える