今回やることを説明してみる
メモリを早いとこ回収させたいがために、GC.Collect() を乱用してしまう人がたまにいるので、簡単なサンプルを交えて説明します。あー、こーゆーことが発生するんだなぁと思っていただければいいと思います。
使用する環境を説明してみる
Visual Studio 2013 Update2 を使用します。
サンプルソースを試してみる
早速下記のソースを実行してみましょう。WindowsFormアプリケーションで Button クリックイベントあたりに実装したらよいかと思います。
private void button1_Click(object sender, EventArgs e) { var d = new Dictionary<string, object>(); //最初はもちろんGen0です。 MessageBox.Show("Generation:" + GC.GetGeneration(d).ToString() + ",object:" + d.ToString()); GC.Collect(); //GC.Collect()で回収対象にならなかったため、Gen1に移動する。 MessageBox.Show("Generation:" + GC.GetGeneration(d).ToString() + ",object:" + d.ToString()); GC.Collect(); //GC.Collect()で回収対象にならなかったため、Gen2に移動する。 MessageBox.Show("Generation:" + GC.GetGeneration(d).ToString() + ",object:" + d.ToString()); var o = new GCTest(); d.Add("test", o); //Gen2 から Gen0 の参照が発生する。 MessageBox.Show("Generation:" + GC.GetGeneration(o).ToString() + ",object:" + o.ToString()); }
実行すると、インスタンス化した Dictionary の世代が 0 → 1 → 2 と上がっていくのがわかるかと思います。そして、世代 0 の GCTest のインスタンスが 世代 2 の Dictionary に追加されます。これにより、早期に解放されるべき世代 0 の GCTest のインスタンスが、解放されないという事態に陥ってしまいます。
おわりに何かいってみる
.NET って難しいなぁ。わからないことだらけです。そもそもこの記事の内容があっているのか、誰か検証してほしいくらいです。
※ガーベージコレクションの本。
- 作者: 中村成洋,相川光,竹内郁雄
- 出版社/メーカー: 秀和システム
- 発売日: 2010/03/18
- メディア: 単行本
- 購入: 25人 クリック: 810回
- この商品を含むブログ (95件) を見る