2


0

ガベージコレクターを強制するには、メモリをオーバーフローさせますか?

ガベージコレクションを強制するために、意図的にメモリをオーバーフローさせるにはどうすればよいですか? 誰かがこのようなアルゴリズムを提案できますか:

while ( garbage collector starts ) {
      overflow my memory with something easily disposable
}

編集:GC.Collectメソッドを目的としたすべての人に。 私は、GCをプログラムで強制的に実行することはできないと常に考えてきました。 推測、私は間違っていた。 答えてくれてありがとう。

7 Answer


8


さらに良いのは、「http://msdn.microsoft.com/en-us/library/xe0c2357.aspx [GC.Collect]の使用方法」です。 利用可能な明示的な機能がある場合、条件を合成する必要はありません…​

また、http://msdn.microsoft.com/en-us/library/system.gc.waitforpendingfinalizers.aspx [GC.WaitForPendingFinalizers]メソッドに注意してください。AdamButler (上記のコメント)、ChristopheD (https: //stackoverflow.com/questions/3791149/overflow-my-memory-to-force-garbage-collector/3791213#3791213 [以下に回答])、およびMichael Petrotta (以下のコメント)_が指摘し、ステップ。 ただし、そのメソッドに関するドキュメントからの怖い引用: "ファイナライザが実行されるスレッドは指定されていないため、このメソッドが終了する保証はありません。" _ shudder


4


GC.Collect`の使用とは別に:ガベージコレクションを同期的に(つまり、blocking)実行する必要がある場合は、 GC.WaitForPendingFinalizers`を使用できます:http://msdn.microsoft.com/en- us / library / system.gc.waitforpendingfinalizers.aspx

これにより、アプリケーションが不必要に一時的にフリーズする可能性があることに注意してください。

リンクは、ガベージコレクターをトリガーするコードも提供します。


2


このSOの質問を参照してください:https://stackoverflow.com/questions/233596/best-practice-for-forcing-garbage-collection-in-c[C#でガベージコレクションを強制するためのベストプラクティス]


1


このように、例えば:

int cnt = GC.CollectionCount(0);
while (GC.CollectionCount(0) == cnt) {
  string s = new String('*', 1000);
}

ただし、これはもちろんガベージコレクションが発生するまで実行されますが、作成されたオブジェクトが原因ではない可能性があり、何らかの理由で発生する可能性があります。

ガベージコレクションを発生させたいだけの場合、 `GC.Collect`メソッドがそれを行います。

ただし、ガベージコレクションを強制する理由はほとんどありません。 必要なときにコレクションが発生します。通常、コレクションを強制することによってのみパフォーマンスが低下します。


0


GC.Collect()が機能しない理由はありますか? 強制的にガベージコレクションが発生します。


0


代わりに、単にGC.Collectを使用してガベージコレクションを強制しないのはなぜですか?


-2


GC.Collect()を呼び出すことはできません