BT

最新技術を追い求めるデベロッパのための情報コミュニティ

寄稿

Topics

地域を選ぶ

InfoQ ホームページ ニュース 深刻なメモリリークに悩まされるWPF

深刻なメモリリークに悩まされるWPF

ブックマーク

原文(投稿日:2009/10/14)へのリンク

WPF (別名Windows Presentation Foundation) は、WindowsプラットホームにおけるUIの今後を示しており、Microsoftの思い通りに行けば、ウェブおよびモバイル市場は、その後継であるSilverlightに引き継がれることになるだろう。しかし、他の新技術と同様、WPFにもいくぶん深刻なメモリリークが発生する点など、克服すべき問題がいつくか存在する。

議論すべきメモリリークは数多く存在し、すでに公表されている。最初の問題は、一時期よく知られていたものだが、その原因に関しては大半の開発者にとって (ある程度WPFに精通している開発者でさえ) わからなかった問題である。この問題が発生する条件は、次の通りである。

  1. データバインディング パスが、オブジェクトXのプロパティPを参照する。
  2. オブジェクトXに、データバインディング操作の対象への直接または間接的な参照が含まれる。
  3. プロパティPは、DependencyPropertyオブジェクトまたはPropertyInfoオブジェクトではなく、PropertyDescriptorオブジェクトを介してアクセスされる。

この問題は、KB 938416で詳述されている。

次の問題は厄介なバグである。これは、データバインディングされた任意のコレクションを別のものと置き替える際に発生する。Ayende Rahien氏により、この問題を再現させる一連のコードが提供されており、これに対し、Mike Brown氏は次のように説明している。

さらに調べてみると、Dataの変更が通知される際に、バインディング システムによってNameプロパティに対するリスナが解放されないことがわかりました。

これは、明らかにバグであり、バこのバグはバインディング システムが問題のバインディングを参照する方法に関係しています。Dataの変更が通知される際、ツリーの下の階層にある既存のバインディング (この場合、TextblockにバインドされているName) を解放し要素を再利用するのではなく、まったく新しい要素のセットが作成されるように見えます。しかし残念ながら、Textblockのバインディングが解放されることは決してありません。

今度は、Dataを監視可能なコレクション (匿名タイプを完全なクラスにする必要がある) にして、そのコレクションでCollectionChangedイベントを発生させる (例: Data[0]=Data[0]) と、何の問題もなく機能します。

次の一連のメモリリークは、Microsoftのブロガー (ハンドルネームjgoldb) によるものだ。

  • 最初のHWNDがXPでデストロイされる場合、CMilChannelがリークする。
  • バインディングを使用して作成された各スレッドに対してShutdownListenerがリークする。
  • XPにおいて、ハードウェア レンダリングを使用してWriteableBitmapを作成および破棄する場合にリークする。
  • XPにおいて、ソフトウェア レンダリングのViewport 3DでVisualBrush、WBなどを使用するとリークする。

彼は、上記に加え、ほかにもメモリリークを引き起こすような開発者にありがちなミスや、すでに修正されている過去のWPFの問題もいくつか挙げている。

この記事に星をつける

おすすめ度
スタイル

BT