ここで奇妙な動作が発生しました。通常のデスクトップ (Win7 prof .)
問題を見つけようとして何度も失敗した後、そのうちの 1 つをモニターのすぐ横に置き、ANTs MemoryProfiler をインストールし、ターミナルと開発用 PC の両方でユーザー操作をシミュレートする 1 時間のテストを実行しました。
その結果、いくつかの奇妙な理由により、組み込みシステムが大量の WeakReference および EffectiveValueEntry[] オブジェクトを積み上げます。
ここにいくつかの写真があります:
開発(PC):
そしてターミナル:
クラス一覧を見てみると…
誰かが以前にこのようなものを見たことがありますか?これに対する既知の解決策はありますか? どこで助けを得ることができますか?
(PSは.net4用に用意されたイメージでインストールされた端末)
PPS: 近い有権者向け: 質問は明確だと思います: どうすればこれを修正できますか。これが IT/OS の問題なのかプログラミングの問題なのかについて議論することもできますが、これをServer Faultに投稿すると、すぐにトピックから外れた結論になると思います...
更新: 問題の大部分を見つけることができました - しかし、それは少し C++ のように感じます: ICommand (RelayCommand-pattern) を (とりわけ) 提供する WPF-List に ViewModel のような Items クラスを使用します。ビューのViewModel-Propertyのゲッターでオンザフライで作成されたアイテムで、アプリケーション/GCがこれらの未使用のコマンドまたはCanExecuteChangedへのサブスクリプションを解放しなかったようです-メモリプロファイラーはそれらを「によって保持されている」と表示します弱参照」。これらの item-viewmodels を再利用するようにコードを変更し、Dispose で使用されているすべてのプロパティを Dispose/set を null に設定し、これもクリーンアップとして使用します。これに加えて、私は強制GC.Collectを30分ごとに使用します(ええ、知っています-決してすべきではありません-しかし、今まで他の解決策はありませんでした)。
これらの WeakReferences がデスクトップ マシン上にあるため、なぜ要求されないのか理解できません...
これについて何か考えはありますか?お願いします!
更新: まだこの問題を突き止めることはできませんが、奇妙な動作が見られます: PC-Anywhere を使用して、端末の 1 つで自分のソフトウェアの動作を観察すると、問題は解決します! 8時間走った後でも。ソフトウェアは正常に実行されます-メモリも解放されます(メイン画面に小さなメモリカウンターディスプレイを配置しました-端末に接続してメモリが不足しているとしましょう-数分待った後、メモリが再利用されます)
したがって、Devin(以下の1つの回答)は正しい方向に進んでいると思います-リモートコントロールソフトウェアの何かがファイナライザースレッドのブロックを解除するか、GCをブロックしているもの-シミュレートされたキーボード/マウスなど.
これについて何か考えはありますか?