5

インタビュー中に、仮想の時間要件を満たすために、c# のコード ブロックを一貫した時間で実行できるようにする方法を考え出すように求められました。インタビュアーは、1 つの方法は、コード ブロックが実行される前にガベージ コレクターを呼び出して収集することであり、そのコード ブロック中に GC が再度実行される可能性を大幅に減らすことだと述べました。これは、医療機器の正確な時間ベースの測定に適用され、ガベージ コレクションがそれらの測定に影響を与える可能性があります。

それは私には理にかなっていますが、それを裏付ける情報は見つかりませんでした。私が確認した一般的なコンセンサスは、GC.Collect() を呼び出さないことであり、例外にはこのシナリオは含まれていませんでした。

GC.Collect() を実行すると、すぐに実行される可能性を本当に減らすことができますか? これは、.net フレームワークを使用してこれを行う正しいアプローチですか? GC.Collect() は他の CLR プログラムでも収集しますか、それとも現在のプロセスにのみ適用されますか?

4

3 に答える 3

13

Jaredの答えはもちろん素晴らしいです。他のいくつかのポイントを追加するには:

GC.Collect() を実行すると、すぐに実行される可能性を本当に減らすことができますか?

はい。

これは、.net フレームワークを使用してこれを行う正しいアプローチですか?

私は、人命の安全に不可欠な機能を備えたソフトウェアの正確性が、コレクターの文書化されていない動作に関する確率論的推測に依存することを望んでいません。

つまり、コレクションの後に WaitForPendingFinalizers を実行する必要があります。ファイナライザーは独自のスレッドで実行されるため、プロセッサー時間を消費する可能性があることに注意してください。

GC.Collect() は他の CLR プログラムでも収集しますか、それとも現在のプロセスにのみ適用されますか?

収集すると、現在のプロセスで管理されているメモリがクリーンアップされるため、1 つのプロセスに複数のアプリドメインがある場合、1 つのアプリドメインで収集すると、他のアプリドメインで収集されます。クロスプロセスにはなりません。

于 2013-03-29T21:53:57.613 に答える
12

a を実行すると、直後のコードで発生する可能性が減ることは間違いありません。GC.Collectこの正確な動作が発生する決定的なシナリオは多数あります。たとえば、次の割り当てで収集が発生し、GC.Collect少なくともシナリオ中に割り当てられたメモリ量が解放された場合。

しかし、それは私が真実であることに決して依存しないものです. 必ずこうなるという保証はありません。実際、シナリオ中にコレクションが発生せず、強制実行時間GC.Collectがシナリオ時間自体を超える可能性があります。

GC.Collect特定のシナリオで が実行されないことを保証する唯一の方法は、

  1. メモリを割り当てない
  2. 他の人に電話させないでくださいGC.Collect

保証するのは非常に困難です。

于 2013-03-29T21:29:38.790 に答える
0

あなたができることは、app.configを介して同時/バックグラウンドガベージコレクションを無効にするように指定することです: MSDNの同時ガベージコレクション

于 2013-03-29T22:11:53.057 に答える