WPF のメモリリーク

WPFアプリを丸一日動かしたら不明なエラーで終了とな・・・



メモリリークかな?やっぱり。



ちょうどいい記事を見つけたので紹介。
http://blogs.msdn.com/b/jgoldb/archive/2008/02/04/finding-memory-leaks-in-wpf-based-applications.aspx


ありうるとしたら

イベントハンドラの不適切な使用
・データバインディングの不適切な使用
・BitmapImage起因のリーク
かな・・・


なるほど。

イベントハンドラのリーク

同じものにイベントハンドラ

Window1.w1.TextBox1.TextChanged += new TextChangedEventHandler(this.TextBox1_TextChanged);

みたいにしまくるとこのイベントが残り続けるらしい。
全部C#コード側で画面レイアウトを生成してるから、これが怪しいな。

ちなみに、これの回避策は

Window1.w1.TextBox1.TextChanged -= new TextChangedEventHandler(this.TextBox1_TextChanged);

とのこと。

BitmapImageのリーク

BitmapImageは、Imageのソース指定をする際に使用するもの。
Image.Sourceに指定すると、それが子要素として保持され続けるため、
gc対象にならない・・・と。

BitmapImage bitmap = new BitmapImage(new Uri("bitmap.bmp", Urikind.RelativeOrAbsolute));
//既にあるImageインスタンス
this.image.Source = bitmap;


おい、画像切り替える度にBitmapImage生成してるぞ、俺・・・

ちなみに、解決法はBitmapImageをフリーズする事みたい。

BitmapImage bitmap = new BitmapImage(new Uri("bitmap.bmp", Urikind.RelativeOrAbsolute));

//フリーズ可能な場合にはフリーズする。
if(bitmap.CanFreeze){
    bitmap.Freeze();
}

//既にあるImageインスタンス
this.image.Source = bitmap;


うーむ。良い感じにJavascriptの時の悪夢を思い出すな