【问题标题】:Why is so much memory taken up, and why isn't it cleared when I close the window?为什么内存占用这么多,关闭窗口时为什么没有清空?
【发布时间】:2013-01-31 06:38:11
【问题描述】:

背景

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

新窗口的部分创建过程创建一个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. 为什么关闭窗口不清除,如何强制清除?

【问题讨论】:

  • 您是否在 Windows 任务管理器中检查了进程选项卡以查看关闭窗口时这些进程是否仍然存在?
  • 正如@daryal 指出的,你有绑定到新窗口的事件吗?
  • 使用几天后,该应用程序将占用超过 1.4GB ... - 这是猜测还是您实际目睹了这一点?
  • 嗨 Henk - 我见过这个。我实际上可以通过关闭和重新打开窗口来重现它。

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


【解决方案1】:
  1. 没有直接的答案,即使是 UI 对象也可能会消耗大量内存,不要只计算对象。
  2. 我猜,你有一个事件绑定到新创建的窗口。如果您不注销事件,则对象不会被 GC 收集。

例如,如果您在主窗口中定义了一个事件并且子窗口已注册到它; GC 不会收集子窗口。那么子窗口引用的对象也不会被收集,比如OverviewItems的列表。您可以使用 WinDbg 来诊断哪些对象没有被收集以及为什么。参考this link。

【讨论】:

  • 对不起,我花了这么长时间才接受这个问题,花了这么长时间才调查这个问题,结果发现事件是罪魁祸首。追踪这个问题已经够棘手了。我终于用 ANTS 内存分析器破解了它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-12
  • 2021-07-13
  • 2012-01-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多