(書きかけ)
ガベコレの説明もしておいた方がいい気がする。
メモリの手動管理 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)
かなり大変な実装になってる