0

私はまだメモリリークと戦っています。改善された MemoryDiagnosticsHelper を使用して、データスタンプを作成してメモリ消費量をすぐに確認できるようにしました。

問題は完全なアプリで始まります: 3 つのアイテムを持つピボットがあり、そのうちの 2 つには 10 ~ 20 個のオブジェクトのリストが含まれています (アイテムの詳細にジャンプする可能性があります)。メモリ診断は、約 50Mb のメモリを消費することを示しています。詳細ページにジャンプしてピボットに戻ると、メモリ消費量は簡単に 70Mb に達します。

最初は、リストを別のアプリに移動しました。スタイルなしでは、15 Mbs かかります。まだ確認していませんが、dll が既に読み込まれているため、ピボットの 2 つのリストには約 20Mbs かかると思います。

そこで、アプリの読み込み段階をさらに深く掘り下げることにしました。

  • InitializePhoneApplication() では、7 Mb かかります。
  • CompleteInitializePhoneApplication() では、空の ViewModelLocator で 8.5 Mb、すべてのビューモデルで 10.5 Mb かかります。かなり大きいですが、30 ~ 40 のデータサービスと 40 ~ 50 のビューモデルがあります。ですから、それがもう成長しなければ、私は自分自身をかなり大丈夫だと感じるでしょう.
  • 最初のページの OnNavigatedTo() では、ほぼ同じで、すべての VM で 10.7 Mb かかりますが、問題ありません。
  • ???
  • 利益なし。真剣に、次に何が起こりますか?次に何が起こっているのか正確にはわかりませんが、MemoryDiagnosticsHelper によると、メモリ消費量は 30 Mbs に跳ね上がります。なんで?すべての dll と VM は既にロードされています。非常に空のページ、完全に白いページを読み込んでいます。

プロファイラー (もちろんリリース モードで実行) も無力です。メモリ消費量の増加を示しているだけですが、管理されていないメモリで発生します。本当に迷惑です。

ここに画像の説明を入力

わかりました、質問をもっときれいにしましょう。アプリが初期化されると (初期化が渡され、viewmodel が読み込まれてアタッチされ、ページが OnNavigatedTo() に渡される)、次に何が起こるでしょうか?

編集 1: 夜に、私のアプリの唯一の弱点 (少なくとも、そのマスター詳細ページ) は MVVMLight の EventToCommand であることに気付きました。Google のほぼ最初の記事はhttp://atomaras.wordpress.com/2012/04/23/solving-mvvmlights-eventtocommand-memory-leak-wp7/です。MvvmLight のブログを確認したところ、Laurent が現在インストーラーを作成中のようです。このリークはすでに解決されているはずですよね?

EDIT 2:リークの問題に対する2つの解決策があります。上記のリンクから修正を使用するか、コードビハインドからコマンドを呼び出します。または、別の MVVM ライブラリを使用します。

4

1 に答える 1

0

参考文献。

アプリの初期化の最初の段階で、それらがよりスムーズに読み込まれることを期待していました。また、メモリ内にマネージ コードがあまりないとプロファイラーが判断した理由も明らかになりました。

于 2013-10-04T11:05:40.667 に答える