为什么这么多的记忆被占用了,为什么没有;当我关上窗户的时候,天还没有晴

本文关键字:为什么 窗户 还没有 记忆 | 更新日期: 2023-09-27 17:59:36

背景

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

新窗口创建过程的一部分创建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. 没有直接的答案,即使是UI对象也可能消耗大量内存,而不仅仅是计算对象
  2. 我想,您有一个事件绑定到新创建的窗口。如果不注销事件,GC将不会收集对象

例如,如果您在主窗口中定义了一个事件,并且子窗口已注册到该事件;GC不会收集子窗口。然后,子窗口引用的对象也不会被收集,就像OverviewItem s的列表一样。您可以使用WinDbg来诊断哪些对象没有被收集以及为什么没有被收集。请参阅此链接。