私は、.Net CLR GCのイントロプレゼンテーションを行い、様々な部分をすべて持っていますが、具体的には、収集を強制しようとすることがどのように危険なものになるか、有害であるかという例が必要でした。私はあなたが時期尚早に高次の世代に物事を強制することができることを知っていますが、(私が言うことができるものから)それは本当に物事を遅らせるだけです。強制的なGCの例が悪化しましたか?
私は、GCを強制的に破損する可能性のある状況を考えようとしています。
私は、.Net CLR GCのイントロプレゼンテーションを行い、様々な部分をすべて持っていますが、具体的には、収集を強制しようとすることがどのように危険なものになるか、有害であるかという例が必要でした。私はあなたが時期尚早に高次の世代に物事を強制することができることを知っていますが、(私が言うことができるものから)それは本当に物事を遅らせるだけです。強制的なGCの例が悪化しましたか?
私は、GCを強制的に破損する可能性のある状況を考えようとしています。
ここに興味深いデモンストレーションがあります。リリースモードでコンパイルされたこのデモを実行する必要があります。そうしないと、アドバタイズされたように動作しない可能性があります。
バージョン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#
にあります。
次の悪い考えはどうですか? 「確かに孤立するリクエスト状態を解決するために、ASP.NETのすべてのHTTP要求後にGCを強制しましょう!
これは、同時のHTTP要求が相互に干渉するため、悪い考えです。これは、多くのの遅延スパイクを導入して、のパフォーマンスを破壊します。すべて無実の「最適化」から始まります。
それは私が考えることができる最悪についてです。
唯一の欠点は時間の喪失です。 – Dialecticus
"コレクションを強制する"とは、GC.Collect()を呼び出すことを意味します。なぜそれが危険だと思いますか?私が忘れてしまったドキュメンテーションはありますか? (私はこれらの日を追い続けることができないので、可能性が高いことを認識しています。) – David
タイトなタイマーは、リアルタイムの要件を備えている可能性がありますか? – leppie