2009-07-19 26 views
17

[OK]を、私はそれについてのいくつかのトピックを読んだが、ここに行く。基本的に毎回ボタンをクリックするアプリケーションがあるとしましょう。多くのことが2〜3分間起こり、その後1時間ほどアイドル状態になります。その直後にGCを呼び出す良い状況が終わったのではないでしょうか.Collect?私は、その瞬間に私のアプリケーションを使用しないことを知っています.GCはそれを推測することはできません。GC.Collect()

答えて

27

GC.Collectを呼び出すことを推奨しない人がいます。

GC.Collectは理由があるので、ここではGC.Collectを呼び出す理由とその理由をお勧めします。

  1. 一般的に、GCを呼び出すことについて心配する必要はありません.GC自体が非常にうまく調整され、正しいことが実行されます。

  2. 場合によっては、これが正しいタイミングであることを知っている状況で終わることがあります。上記の状況は、実際にはAsp.NetがGC.Collectあなたが説明したものと似ている特定の点で。

  3. GCはGC.Collectを呼び出した場合はスマートですが、GC.Collectを呼び出した場合、GCはあなたの決定を上書きできますが、GC.Collectをコールするときにフラグを設定する必要がありますこれはGC.Collectを呼び出す際に推奨される方法です。GCが収集するのが適切かどうかをGCが判断させるためです。

  4. GC.Collectを呼び出すための一般的な声明はありません。あなたが本当にあなたがそれを呼び出す必要がない限り、必ず呼び出さないようにしてください。ある。

  5. あなたがある場合

    1. あなたは、メモリ不足の状況にあり、コレクションについて熱心になりたい場合は、一般的に、あなたがこのような状況を気になり、すぐにごみを解放されて、それを呼び出してから取得する利点低メモリの状況では、GCはとにかく積極的になり、マシンのメモリ圧が高い場合は自動的に起動します。
    2. メモリ不足の状態にならずに熱心に収集したい場合。

希望します。
ありがとう

+0

ああ、ついに.... –

+0

:)私が言及したように、一般的なルールとして私の推薦を取らないでください、それは例外的なケースです。ちょうどあなたのケースに合って起こった:) – mfawzymkh

+0

あなたの2番目の点は間違っています。デフォルトは強制モードです –

6

GC.Collect()に電話をする理由はほとんどありません。

あなたの場合、それを呼び出す理由はまったくありません。 1時間アイドル状態の場合、GC になります。

+0

はい、次の分にある可能性があります。 私が処理を終了したとき、私はGC.Collect()を実行するのに数秒かかると、その瞬間にパフォーマンスが低下することはないことを知っています。 –

+4

+1。 GC.Collect()を呼び出すと、実際にオブジェクトの存続期間を促進できます –

+0

オブジェクトの存続期間を促進することとはどういう意味ですか? –

18

アプリケーションをプロトタイプ作成または構築してパフォーマンスをテストする前に、GC.Collectを呼び出すことを心配することは、ほとんどの場合、時期尚早の最適化です。 GCは通常、適切な時にメモリを収集するのに非常に優れています。アプリケーションがアイドル状態の間は、特にシステムにメモリが残っている場合は、コレクションを確実に実行します。

優れた世代別GC割り当て手法(小さなオブジェクト、短い使用法など)に従うことが重要であり、必要とするパフォーマンス特性が得られる可能性が高くなります。依然として必要なパフォーマンスが得られない場合は、プロファイリングとデザインの後、ソリューションとしてGC.Collectを考えるかもしれません。

+0

これは、 "no gc collections"全体よりも妥当な答えに思えます。どこでもポップアップが表示されます。 –

+0

+1。 *なぜ* GC.Collect()のほうがほとんど常に不要です。 – Randolpho

+0

非常に包括的ですが簡潔 – Guvante

1

GC.Collect()をいつ呼び出すかを知るには、ランタイムに関連する特定のコレクタの詳細と、コレクションで解決できる弱点に関する詳細情報を知る必要があります。

つまり、GC.Collect()に電話する必要があるときは本当に分かっていて、他のコードではうまくやっていないと思われる場合は、おそらくCLR Internalsで問題を解決できます。

+0

私の主なポイントは主にこれです:GC.Collect()の場合は何も問題はありません。何も間違っていなければ、私たちがそれをやると失うものは何もありません。私たちのプロセスが少なくともある瞬間に実行されるのではなく、アイドル状態になることが少なくともあることはわかっています。それとも私が行方不明のものは何ですか?ありがとうございます。 –

+0

はい、GC.Collect()を呼び出すと、プログラムのパフォーマンスに甚大な影響を与える可能性があります。それとも何もできません。覚えておくべき重要なことは、Javaの初期の時代とは異なり、現代のGCは業務上非常に優れており、アプリケーションのパフォーマンス上の問題の原因となることはほとんどありません。実際、.NETおよびJava GCは、多くのC/C++アロケータ実装よりも高速です。 –

+0

私のプログラムのパフォーマンスにどのような影響がありますか?プロセスが実行されている間に偶然それが起こるのであれば、私のプログラムのパフォーマンスに壊滅的な影響を与えると思います。 –

4

GC.Collectを呼び出しても、それ以上の(またはそれ以下の)オブジェクトが収集されることはないことをご存じでしょうか。

時間を最適化しようとしている場合は、GCがアプリケーション内のオブジェクトを収集する時間を知っていますか?デスクトップオペレーティングシステム(XP、Vistaなど)では、CLRはコンカレントGCを使用し、コレクションの期間、アプリケーション内のすべてのスレッドを中断することなく実行できます。それはギアのうち、CLR GCチューニングアルゴリズムをスロー

  1. ので

    明示的にGC.Collectを呼び出す

    はお勧めしません。チューナーは、GCを自動的にトリガーするタイミングを決定し、そのGCを手動で強制的に計算します。

  2. コレクションを手動で強制することで、次のGCで収集された可能性のあるオブジェクト(世代がGCに入る前に「孤立している」場合)までオブジェクトを昇格させることができます。

これらの種類のシナリオで.NET 4.0、GC notification mechanismが導入されたことは興味深いかもしれません。

+0

返事をありがとう。 「GCがアプリケーション内のオブジェクトを収集する時間を知っていますか?デスクトップオペレーティングシステム(XP、Vistaなど)では、CLRは同時GCを使用して実行できますコレクション中にアプリケーション内のすべてのスレッドを一時停止することはありません。 "私が読んだところでは、GCコレクションは非常に高速です(世代0のページフォールトの時間を超えてはいけません)。 あなたのポイントについて2)、それは議論の良さには見えません。通常のGCを実行する場合も同様です。 –

+0

GCコレクションがかなり速い場合は、時間を節約するために手動で呼び出すのはどうしてですか? 2番目の点については、通常のGCが発生したときにも同じことが起こりますが、GCはいつ実行するかを決定します。これはGCチューニングアルゴリズムによって決定されます。アプリケーションがオブジェクトを割り当てる方法にパターンがあり、その知識を使用して可能な限り最善の時間(この場合は少し後)にGCを起動させることができます。それはより多くのオブジェクトを収集し、より少ないオブジェクトを促進するでしょう。 –

+0

これは、私たちのプログラムがどのように働いているのか私たちのプログラマーよりもGCが優れていると思われるという印象を与えるだけです。私のコンピュータが2分間アイドルになるたびに、私のプロセスが邪魔になるかもしれませんが、私はGCが今も同じことを信じることは難しいと感じています。 GCと手動GCの最適な時期を知るという議論は、確かに実を結ぶものではありません。 –

0

通常、GCは、新しいメモリを割り当てる場合にのみ呼び出されます。メモリを使い果たしていない場合は、GCを呼び出すとパフォーマンスが0%向上します。あなたは今日のコンピュータのRAMの限界に近づくためにも非常に微妙にリソースを集中するアプリケーションを持っている必要があります。

プログラムに外部リソース(ファイルやCOM/DCOM参照など)がたくさんある場合、GCを呼び出す可能性があります。

GCを呼び出すと、安心してご利用いただけます。それはおそらく助けにはならないが、確かに傷つけないだろう。

+0

Um。人々は古いマシンでソフトウェアを実行します。人々が自分のマシンをクリーンアップしてよりうまく動作するように手助けすると、50-100 MBのワーキングセットを使用するソフトウェアが見つかることが多く、インターネット通話や何かばかげたものを待つことができます。 1 GBのマシンでは、これらのことがすぐに追加されます! –

0

他の投稿に記載されているようにGCはあなたよりもコレクションを開始するタイミングがアプリケーションでクリックされていないということを意味するわけではありません。オブジェクトを移動すると、GC.Collectを悪用するとパフォーマンスが低下する可能性があります。

関連する問題