アプリケーションの背景
私たちのプラットフォームは、クリックワンスのWPFアプリケーションです。ナビゲーションメニュー構造を含む「シェル」があり、独自のカスタム「ページ」クラスをホストしています。新しいページに移動すると、シェルのコンテンツが(基本的に)スワップアウトされます。
問題
それで、私は非常に大規模なソフトウェアプロジェクトに取り組んでいる会社で働いています。メモリの問題を見つけたコードがたくさんあります。
問題は、イベントが配線されていて、配線されていない場所がアプリケーションにたくさんあることです。開発者がこれを行った理由はわかりません。ユーザーが新しい「ページ」に移動するたびにオブジェクトがクリーンアップされることを期待していたと思います。
(このリリースでは)すべてのページをリファクタリングするオプションはありません。オブジェクトからすべての参照を削除するC#の方法はありますか?(したがって、ガベージコレクターがそのオブジェクトをそのすべての内部参照とともに破棄できるようにします)
このメモリを取り戻そうとしていますが、処理するWPFがある場合、オブジェクトがまだページ(オブジェクト参照)を参照していることを見つけるのは非常に複雑です。
視覚的および論理的なツリーを調べ、プロファイリングアプリケーションを使用して、手動で物事をクリーンアップするのに役立てました(アイデアを証明するため)。これも非常に難しいことがわかりました。
私は座って考えました。なぜオブジェクト参照を見つけるためにこのすべての作業を行うのでしょうか。閉じたときにこの「ページ」を単に「逆参照」することはできないのでしょうか。
それは私をここに連れて来ます:)
どんな助けでも大歓迎です!
更新1
コメントでは、次のことが尋ねられました。
Q:アプリはありますか。実際にメモリの問題がありますか?これらはどのように展示/検出されますか?それとも、GC2が発生するまで、このメモリはぶらぶらしていますか?–ミッチ小麦
A:メモリに問題があります。ページを離れると(ページを保持するプロパティが新しいオブジェクトに設定されます)、古いオブジェクトがガベージコレクターによって収集されることはありません。したがって、メモリは増え続けます。私たちの会社が最初からやり直した場合、このアプリケーションで。最初に確認する必要があるのは、WeakEventパターンを実装し、WPFでより多くのルーテッドコマンドを使用することです。
更新2
私は自分自身の解決策を思いつくことができました。