2012-07-23 4 views
8

私は、.Net CLR GCのイントロプレゼンテーションを行い、様々な部分をすべて持っていますが、具体的には、収集を強制しようとすることがどのように危険なものになるか、有害であるかという例が必要でした。私はあなたが時期尚早に高次の世代に物事を強制することができることを知っていますが、(私が言うことができるものから)それは本当に物事を遅らせるだけです。強制的なGCの例が悪化しましたか?

私は、GCを強制的に破損する可能性のある状況を考えようとしています。

+2

唯一の欠点は時間の喪失です。 – Dialecticus

+0

"コレクションを強制する"とは、GC.Collect()を呼び出すことを意味します。なぜそれが危険だと思いますか?私が忘れてしまったドキュメンテーションはありますか? (私はこれらの日を追い続けることができないので、可能性が高いことを認識しています。) – David

+0

タイトなタイマーは、リアルタイムの要件を備えている可能性がありますか? – leppie

答えて

4

ここに興味深いデモンストレーションがあります。リリースモードでコンパイルされたこのデモを実行する必要があります。そうしないと、アドバタイズされたように動作しない可能性があります。

バージョン1:1は喜んで秒後にテキストボックスに日付と時刻を表示します

private void Button_Click(object sender, EventArgs e) 
{ 
    Timer timer = new Timer(Print, null, 0, 1000); 
} 

private void Print(Object o) 
{ 
    if (textBox1.InvokeRequired) 
    { 
     Action<object> action = Print; 
     textBox1.Invoke(action, o); 
     return; 
    } 

    textBox1.Text = DateTime.Now.ToString(); 
} 

バージョン。

バージョン2:宣言の後、タイマーオブジェクトへの参照がなくなった、ので、今

private void Button_Click(object sender, EventArgs e) 
{ 
    Timer timer = new Timer(Print, null, 0, 1000); 
} 

private void Print(Object o) 
{ 
    if (textBox1.InvokeRequired) 
    { 
     Action<object> action = Print; 
     textBox1.Invoke(action, o); 
     return; 
    } 

    textBox1.Text = DateTime.Now.ToString(); 

    GC.Collect(); // force a garbage collection 
} 

バージョン2では、日付と時刻が一度だけ印刷され、かつそのタイマーオブジェクトを取得します集めました。

これはかなり工夫された例ですが、良いデモンストレーションになるかもしれません。

これはJeffery Richter氏の功績でもあります。彼の優れた本CLR via C#にあります。

+0

'new timer(...')を呼び出して戻り値を保存しなかった場合、この動作は予期しないものになると思います。 –

+2

しかしこの場合、 'GC.Collect()'はそれほど悪くはありませんが、アプリケーションでバグを発見するのに役立ちました。 'GC.Collect()'がなければ、将来はしばらく時間を無駄にするでしょう。 – svick

+0

@svick - 良い点。おそらくスコープ上のより良い教訓かもしれません。いずれにせよ、それは興味深いものであり、GCについて考えている人がいます。 – James

1

次の悪い考えはどうですか? 「確かに孤立するリクエスト状態を解決するために、ASP.NETのすべてのHTTP要求後にGCを強制しましょう!

これは、同時のHTTP要求が相互に干渉するため、悪い考えです。これは、多くのの遅延スパイクを導入して、のパフォーマンスを破壊します。すべて無実の「最適化」から始まります。

それは私が考えることができる最悪についてです。

関連する問題