トップ回答者
MVVMについて

質問
-
MVVM(Livet)を使って入力フォームを設計する際にリスト(主にコンボボックスなど)
選択することを趣旨としたリストについてもメモリリークの対象となるでしょうか?
具体的にはRepositoryクラスでDBよりデータを取得し、Modelのコレクションとして
ViewModelにプロパティとして持たせる、そのリストは選択するだけで、特にデータ更新等は
行わない、というものです。
Modelにはプロパティの更新イベントは実装していません。
リストの件数は3000~4000くらいでリストをぐりぐりスクロールさせると、
メモリ使用量がぐんぐん上がっていくのをタスクマネージャで確認しました。
(これがMVVMが問題視しているメモリリークなのか私は判断できません)
これが問題視されているものならばどのように対処すればよいでしょうか?
回答
すべての返信
-
こんにちわ。Livetのauthorです。
★メモリリークかどうかの確認
メモリ使用量がグングン増えているならば、
なんらかのボタンを一時的に用意するなどしてGC.Collect(); GC.WaitForPendingFinalizers(); GC.Collect();
を呼び出してみてください。
それでもメモリ使用量が減らないのであれば(つまりスクロールするたびにメモリ使用量が増えていくならば)確かにメモリリークです。
★メモリリークの原因の調査
メモリリークの調査は、WPF環境であるならば幸いそこまでは難しくありません。
http://msdn.microsoft.com/ja-jp/library/bb190764.aspx
を参考にしながらDumpHeapコマンドでリークして増えているオブジェクトを、
GCRootコマンドでそのオブジェクトを参照しているオブジェクトを調べる事ができます。
GCRootコマンドの結果に想定外の参照が存在した場合それがメモリリークの原因です。イベント由来のリークの場合、「イベントの発行元がイベントの受信オブジェクトをいつまでも参照しっぱなし」が原因です。
イベント由来のリークについて詳しくはこちらに書いたので参照してください。http://ugaya40.net/codememo/commonweakevent.html
★Livetについて
もしもLivet由来であったと判明した時は対応しますのでお知らせください。
よろしくお願いいたします。なおLivetは1.0パッケージはすでに用意できており、現在ドキュメントをサイトを構築中です。
もしも0.99で不満がある場合は1.0を利用していただけると幸いです。
Livet1.0パッケージ http://dl.dropbox.com/u/31027404/LivetSetup_1.0.0.exe
Livet0.99からの変更点 https://gist.github.com/2787412
以上、よろしくお願いいたします。
- 編集済み Masanori Onoue - ugaya40 - 2012年5月30日 11:26