++C++; // 未確認飛行 C 連載:次世代技術につながるSilverlight入門 C#たんと学ぶ/わりと硬派なソフトウェア開発講座 第3回「Webアプリケーション」(前編)

Top総合 目次C# によるプログラミング入門

ガベージ コレクション

このエントリーをはてなブックマークに追加

目次

キーワード

概要

(書きかけ)

ガベコレの説明もしておいた方がいい気がする。

メモリの手動管理 Vs. 自動管理

マーク&スイープ
世代別、0~2
コンパクション

Compact Framework の場合、世代持ってない
Xbox とか、Mango Update 前の Windows Phone 7 とか、GC 遅い

Large Object Heap

Finalize
Dispose パターン
  マネージ リソースは Dispose のみで、
  ネイティブ リソースは Finalize でも解放
  ↑これをやるために、Dispose(bool) メソッド作るパターンが
↑
ちゃんと作ってあるクラスなら、ネイティブ リソースを Finalize で解放するので、Dispose 呼ばなくてもメモリ リーク起こすことはない。
  けども、GC よりだいぶ前に不要になっていても、GC のタイミングまで解放されないので勿体ない
  (可能な限りちゃんと Dispose 呼ぶべき)

例えばの話、Task クラスは IDisposable なのだけども、こいつの Dispose を呼ぶタイミングを自前で決めるのかなり大変。
    で、Task の場合、ネイティブ リソースは、4byte ほどの小さいやつ、かつ、Wait とかしたときにだけ確保する。
    たいていの状況下では Dispose しなくてもインパクト小さい。


弱参照
  通常の参照との違い
  GCHandle
  WeakReference

キャッシュに弱参照を使う
  第0世代GCはかなり頻繁に起きるので、弱参照でキャッシュしようと思ってもほぼ消えてて意味ない
  大きなオブジェクト(LOH に入る用なの)は、最初から第2世代扱いなので、それなりに意味ある

弱イベント パターン
  GUI アプリにおいて、イベントがよくメモリ リークの原因になる

  「弱参照の非決定的な挙動は嫌だ」
  →「UI動的生成したりするとDisposeできないんだよ」
  →「しょうがないね、弱参照にしようか」的展開。

  結局、WPF で導入したのは、WeakEventManager クラス作って、
  弱参照+Manager 内でも可能な限り Dispose できるタイミングを管理
    (Assenbly の Unload 時とか、Dispatcher の Shutdown 時とかに Remove Listener)
    かなり大変な実装になってる

[お問い合わせ](q)