-1

私の調査によると、一般的な経験則は GC をいじらないことです (つまり、GC.Collect() を呼び出さないでください)。巨大な XML ドキュメントを処理するサーバー ベースのプロセスがあり、メモリが解放されることはありません。コードは次のようになります。

while (!abort)
{
  mutex.WaitOne();

  //sets abort to true to end the process itself
  DoSomeWork();

  mutex.ReleaseMutex();
}

DoSomeWork() の実行後、メモリは決して解放されません。これは、GC がそのことを行うための「単独の時間」を取得していないために発生していますか? DoSomeWork() の後に GC.Collect を呼び出して GC を強制する必要がありますか?

ありがとう

4

2 に答える 2

1

GC.Collect開発環境で呼び出してみて、何が起こるか見てみましょう。メモリがダウンしない場合は、メモリ リークが発生しています。実際に使い終わったオブジェクトをリリースしていないこと、およびそれらへの参照がどこかにあることを意味する場合があります。または、管理されていないメモリを適切に破棄していない可能性があります。ダウンした場合は、GC に時間を与える必要があることを意味します。

オブジェクトが実際にコレクションの対象である場合 (前のテストに従って)、メモリがすぐにダウンすることが不可欠かどうか、または GC がスケジュールされるまで数百ミリ秒待機しても問題ないかどうかを検討してください。OOM エラーが発生していますか。この結果、アプリケーションはディスクにスワップされていますか? いいえの場合は、GC がそれを行うのを待つことを検討してください。

また、パフォーマンスが問題なのか、メモリだけなのかを自問してください。手動で呼び出すCollectと、パフォーマンスが低下する可能性がありますが、改善されません。

于 2012-12-03T17:10:26.083 に答える
0

大量のオブジェクトを強制終了したプロセスが完了したら、気軽に GC.Collect を呼び出してください。XML 文書の処理は、これが適切なケースの典型的な例です。絶対に GC.Collect に電話しないと言う人は、教えられたことを単に保持しているだけです

于 2012-12-03T16:25:57.607 に答える