.NETCFのメモリリーク-動的コントロールの作成?
-
03-07-2019 - |
質問
.NET CFアプリケーションのメモリリークに問題があります。
RPMの使用コントロールは期待どおりにガベージコレクションされません。 .NETウィンドウフォームで同じコードを実行すると、動作が異なり、期待どおりにコントロールが破棄されます。
プロセスヒープ カウンターについては、PerfMonを介したRPMからの出力を参照してください:
GCヒープ:
私の推測では、パネルへの弱い参照が何らかの理由でオブジェクトを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
これがお役に立てば幸いです!