为什么要占用太多内存,为什么关闭窗口时它不会被清除?

时间:2013-02-15 09:58:13

标签: c# wpf memory-management memory-leaks

背景

我有一个显示客户列表的应用程序。用户可以创建新窗口以查看特定客户的详细信息。

新窗口的部分创建过程会创建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错误。

**我知道它不是内存分析器,但它是我目前唯一的东西

问题

所以问题是:

  1. 为什么创建看似简单的几个对象会占用太多内存。
  2. 当窗户关闭时为什么不清除它,我该如何强制它清除?

1 个答案:

答案 0 :(得分:2)

  1. 没有直接的答案,即使UI对象可能消耗大量内存,也不仅仅是计算对象。
  2. 我想,你有一个事件绑定到新创建的窗口。如果您没有注册事件,GC将不会收集这些对象。
  3. 例如,如果您在主窗口中定义了一个事件,则会向其注册子窗口; GC不会收集子窗口。然后,也不会收集子窗口引用的对象,如OverviewItem的列表。您可以使用WinDbg来诊断未收集哪些对象以及原因。请参阅this link