ガベージコレクターを強制的に実行する方法は?


147

インタビュアーは今日これについて私に尋ねました...答えはありますか?


3
:この質問はあなたががそれを行うべきではない理由についての良い情報があるstackoverflow.com/questions/118633/...
ハンス・オルソン

1
なぜあなたはこのように言っているのですか
Andrew Collins

1
@ジェイソン-たぶんインタビュアーは解決策を聞きたくなかったのではなく、アンドリューの知識とそれを行うことに対する推論を得たくなったのなら、この質問は効果的に理解できるでしょう。
martinstoeckli 2012

2
@martinstoeckliそれはまだひどい質問です。ストレスの多いインタビューで知識を持っている人は、それがトリックの質問であることに気付かなかったり、追加の情報を提供しようとは思わないでしょう。その質問は、インタビュアーが知識のある人と知識のない人を区別するのに役立ちません。だから問題はまだひどいです。
ジェームズ

2
「いつガベージコレクションを強制しますか?」私にとっては面接の質問のように聞こえます( "方法":それほどではない)。初心者:分からない。中級:ありません。エキスパート:メモリリークのテストを書くとき。
mikebridge 2015

回答:


188

System.GC.Collect()ガベージコレクターを強制的に実行します。これは推奨されませんが、状況が発生した場合に使用できます。


17
なぜそれが推奨されないのですか?
ルークTオブライエン

5
GC.Collect()は実行にコストがかかります。必要以上に行うことはお勧めできません。いつ呼び出すべきかについてのコードはよく書かれています。通常は、特殊なエッジケースでのみ自己収集する必要があります。stackoverflow.com/a/21961777/2710988
Brandon Barkley

186

明示的にgcを呼び出すことはお勧めしませんが、

GC.Collect();
GC.WaitForPendingFinalizers();

コード全体で明示的にGCを呼び出します。GC.WaitForPendingFinalizers();後で呼び出すことを忘れないでくださいGC.Collect()


14
WaitForPendingFinalizers必ずしも「より良いパフォーマンス」が得られるわけではありません。ファイナライズキュー内のすべてのオブジェクトがファイナライズされるまでブロックするだけです(以前のの呼び出しによってそこに配置された可能性のあるオブジェクトCollect)。あなたが収集するこれらのオブジェクトのためのチャンスをしたいなら、あなたは必要とするの呼び出しCollect 後に呼び出しをWaitForPendingFinalizers
LukeH 2010年

2
gc.Collectを呼び出す数少ない正当な理由の1つは、適切に破棄されなかったリソースを解放するための最後の努力であるため、WaitForPendingFinalizersは必要なステップのように思われます。ただし、そのような場合に過度にgc.Collectを呼び出さないようにするためのベストプラクティスはわかりません。ところで、世代を促進するためにgc.Collectが「持っている」という技術的な理由があるのでしょうか。それを前進させることを正当化するのに十分なものが割り当てられていない限り、世代を置いたままにしておく方がより便利に見えるでしょう。
スーパーキャット

2
C#の初心者向けの注意(私のような):GC強制呼び出しは保証されません。具体的な未使用のオブジェクトがメモリから削除されます。(これを実行するための1つの方法は、「usingステートメント」(で使用しているmsdn.microsoft.com/ru-ru/library/yh598w02(v=vs.80).aspx))
user1234567

電話をかけることが重要であると思われるのはなぜWaitForPendingFinalizersですか?
クリスチャン

19
GC.Collect() 

MDSNから、

このメソッドを使用して、アクセスできないすべてのメモリを解放しようとします。

すべてのオブジェクトは、それらがメモリに保持されている期間に関係なく、収集対象と見なされます。ただし、マネージコードで参照されているオブジェクトは収集されません。この方法を使用して、システムに使用可能なメモリの最大量を再利用するように強制します。



12

GC.Collect();

ただし、ガベージコレクターが期待どおりにクリーンアップできない場合があることに注意してください...


5
それはどういう意味ですか?意外ときれいになりませんか?
Voldemort 2015年

5
@Voldemort-意外と何もきれいになりません。しかし、それはあなたが期待するすべてをクリーンアップしないかもしれません。
Justin Niessner、2015年

6

ガベージコレクターを強制的に実行したくない場合。

ただし、これを行った場合(もちろん、純粋に学術的な演習として)、

GC.Collect()

4
私は@Karthikの答えを好みます。アプリが正当にGC.Collect()を呼び出す必要がある状況がある可能性があります。非常にまれですが。
Henk Holterman、2010年

2
弱い参照の配列があり、「ライブ」参照が存在するかどうかを確認したいとします。チェックする前にGC.Collect()を呼び出すことは理にかなっています。ただ言って。
Rich Ehmer 2014

1
冒頭の発言が事実上正しくないため、反対票が投じられました。はい、ガベージコレクターを強制的に実行します。
Syndog

5

.Net Frameworkはこれを自動的に行いますが念のために考えています。まず、消去するものを選択してから、ガベージコレクターを呼び出します。

randomClass object1 = new randomClass
...
...
// Give a null value to the code you want to delete
object1 = null;
// Then call the garbage collector to erase what you gave the null value
GC.Collect();

私はそれだと思います。誰かを助けたいと思います。

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