質問

.NET CFアプリケーションのメモリリークに問題があります。

RPMの使用コントロールは期待どおりにガベージコレクションされません。 .NETウィンドウフォームで同じコードを実行すると、動作が異なり、期待どおりにコントロールが破棄されます。

プロセスヒープ カウンターについては、PerfMonを介したRPMからの出力を参照してください:
alt text

GCヒープ:
alt text

私の推測では、パネルへの弱い参照が何らかの理由でオブジェクトをGCに適格にしないのではないでしょうか?

注意: Dispose()はサンプルの問題を解決しますが、それほど明確ではないため、既存のアプリケーションに簡単に組み込むことはできません。オブジェクトが使用されなくなった時期を判断します。

問題を説明するために、ソースの簡易バージョンを含めました:

using System;
using System.Windows.Forms;

namespace CFMemTest
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        // Calling this event handler multiple times causes the memory leak
        private void Button1_Click(object sender, EventArgs e)
        {
            Panel uc = new Panel();
            // Calling uc.Dispose() cleans up the object 
        }
    }
}

更新:
1. GC.Collect()を呼び出しても、パネルはクリーンアップされません。
2. Windows CE 4.2デバイスで.NET CF 2.0 SP1を使用します。

役に立ちましたか?

解決

この動作を説明する追加情報がここにあります。

イリヤトゥマノフによると

  

NETCFに関連するすべてのUIは   GCスコープから意図的に削除されたため、   収集されることはありません。この動作   デスクトップとは異なり、   NETCF V3.5で変更(実行されていない場合)   互換モードで)。

     

管理されたUI   NETCFのクラスは完全に   デスクトップとは異なります。彼らは薄いです   ネイティブ実装のラッパー   許容範囲を達成するために必要でした   パフォーマンス。

     

私はそのようなリソースがあるかどうかわかりません。   しかし、実際に知っておくべきことは次のとおりです。   収集されていないため、電話する必要があります   廃棄します。あなたは実際にそれをする必要があります   デスクトップでも同様ですが、そうでない場合は   より寛容です。そうではない   NETCF。

他のヒント

フォームは、その存在を知る方法がないため、コードで作成されたすべてのコントロールを自動的に破棄しません。破棄されたときに自動的に破棄するフォームを取得するには、Controlsコレクションに追加する必要があります。

今、あなたの場合、それは何もしないかもしれません。あなたの例が不自然なのか、現実の世界なのかわかりません。実世界の場合は、変数がスコープ外になったときにPanelが収集されないため、動作が期待されます(デスクトップでも同様です)。これはコレクションに使用可能になりますが、それは単に次のコレクションパスでスイープされることを意味します。 GCを引き起こしていない限り、GCは解放されません。

CFのメモリ管理に関するMSDN Webキャスト。フードの下で何が起こっているかについて、より徹底的な説明を提供します-ここでの回答で提供できるものよりもはるかに多くです。

メモリリークがありますか? .NET Compact Frameworkのガベージコレクターの動作は、完全な.NET Frameworkのものとはわずかに異なります。 Steven Pratschnerのブログから:

  

次のいずれかの場合に収集が開始されます。

     
      
  • 1MBのオブジェクトが割り当てられました。

  •   
  • アプリケーションがバックグラウンドに移動しました

  •   
  • メモリの割り当てに失敗しました

  •   
  • アプリケーションはGC.Collectを呼び出します。

  •   

このブログからわかるように、Button Click EventHandlerも動的に削除する必要があると思います。 http://blogs.msdn.com/stevenpr/archive/2007/03/08/finding-managed-memory-leaks-using-the-net-cf-remote-performance-monitor.aspx

Steven Pratschnerからもです。

ところで、上記のウェブキャストはここにリンクされています: http://msevents.microsoft.com/cui/ WebCastEventDetails.aspx?culture = en-US& EventID = 1032318791& CountryCode = US

これがお役に立てば幸いです!

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top