バックグラウンド
顧客のリストを表示するアプリケーションがあります。ユーザーは、特定の顧客の詳細を表示する新しいウィンドウを作成できます。
新しいウィンドウの作成プロセスの一部で、 が作成されますList<OverviewItem>
。ここで、OverviewItem
は次のように定義されます。
public class OverviewItem
{
public string Title { get; set; }
public string Info { get; set; }
public OverviewItem(string title, string info)
{
this.Title = title;
this.Info = info;
}
}
その後に、次のような 25 行のコードが続きます。
overviewItems.Add(new OverviewItem("some label string", "some value string"));
次に、次のように、ウィンドウの XAML で定義されている DataGrid にリストをバインドします。
dgOverview.ItemsSource = overviewItems;
アプリケーションを実行すると、リストが作成された時点と 25 番目の項目が追加された時点 (DataGrid バインディングの前) の間で、約 20MB のメモリが使用されていることがタスク マネージャー** で確認できます。
問題は、ウィンドウを閉じてもメモリがクリアされないことです。ウィンドウを再度開くと、さらに 20MB のメモリが使用され、後続のウィンドウが開かれるたびに 20MB のメモリが使用され続けます。
.net フレームワークがメモリを管理してくれるという印象を受けましたが、この場合はそうではないようです。数日使用すると、アプリケーションは 1.4GB を超えるメモリを占有し、その時点でユーザーはOutOfMemoryException
エラーを経験し始めます。
** メモリ プロファイラではないことはわかっていますが、現時点ではそれしかありません
質問
質問は次のとおりです。
- いくつかの単純なオブジェクトのように見えるものの作成によって、なぜこれほど多くのメモリが消費されるのでしょうか。
- ウィンドウを閉じたときにクリアされないのはなぜですか?どうすれば強制的にクリアできますか?