C# Winforms中的内存使用

C# Winforms中的内存使用,c#,winforms,visual-studio-2008,memory,memory-leaks,C#,Winforms,Visual Studio 2008,Memory,Memory Leaks,我有两个表单的非常简单的应用程序(创建来测试内存)。解决方案有三个项目。第一个有表格,第二个是DAL,第三个是ComonLib (所有这些内存数据都来自任务管理器。问题末尾有4个内存分析器图像的URL) 当我运行我的应用程序时,内存使用量约为8MB。这个表单只有两个按钮。一个按钮用于打开第二个表单,另一个按钮用于收集GC 当我打开第二个窗体时,内存增加到大约550MB。此表单有一个网格,加载事件中在此网格中加载数据(1000s记录) 打开第二张表格的代码 CallWidnows cw = new

我有两个表单的非常简单的应用程序(创建来测试内存)。解决方案有三个项目。第一个有表格,第二个是DAL,第三个是ComonLib

(所有这些内存数据都来自任务管理器。问题末尾有4个内存分析器图像的URL)

当我运行我的应用程序时,内存使用量约为
8MB
。这个表单只有两个按钮。一个按钮用于打开第二个表单,另一个按钮用于收集
GC

当我打开第二个窗体时,内存增加到大约
550MB
。此表单有一个网格,加载事件中在此网格中加载数据(
1000s记录

打开第二张表格的代码

CallWidnows cw = new CallWidnows();
cw.ShowDialog();
cw.Dispose();
dataGridView1.Dispose();
第二种形式的加载事件

Customers customers = new Customers();
dataGridView1.DataSource = customers.GetAllCustomers();
结束第二阶段的活动

CallWidnows cw = new CallWidnows();
cw.ShowDialog();
cw.Dispose();
dataGridView1.Dispose();
但在关闭第二个表单后,内存使用量没有变化,内存使用量仍然是550MB

等了大约一分钟后,我显式地调用了
GC.Collect()
,只释放了几MB内存,变成了
530MB

等待大约一分钟后,我再次调用
GC.Collect()
,现在内存降到
40MB

  • 有人能帮我理解这一点吗 内存使用行为

  • 为什么要处理窗体和网格内存 未发布?

  • 为什么第二次打电话
    GC.Collect()
    所有内存 释放了,但不是我叫它的时候 第一次
我原来的应用程序有几十个表单和用户控件,我正在处理这个应用程序的内存问题

  • 有人能提出一些解决方法吗 分析Winforms应用程序中的内存使用情况
单面质询: 最初我将以下方法作为静态方法

Customers customers = new Customers();
dataGridView1.DataSource = customers.GetAllCustomers();
就像

// Static GetAllCustomers method
dataGridView1.DataSource = Customers.GetAllCustomers();
  • 在我最初的应用程序中,所有 方法是静态的。静态方法 可能是内存泄漏的原因 像上面那样使用
内存探查器映像:


谢谢。

释放内存的两个GC表示正在终结器中清理内存(例如COM对象,任何需要dispose清理的对象)。第一个GC定位对象,但只安排它们完成。下一个GC运行它们。您可以在第一次GC之后调用WaitForPendingFinalizers来测试这是否为真-然后不需要两次GC

对我来说,我使用WinDbg和SOS dll来理解这些问题。您也可以在VisualStudio中加载SOS,但我更喜欢WinDbg。SOS dll允许您将对象转储到堆上,并查看它们为何是根对象(即什么对象使它们保持活动状态并需要进行处置)


并不是每个人都有相同的技能,因此可以在这个问题中找到查找.net泄漏的其他建议:。

释放内存的两个GC是在终结器中清理内存的标志(例如COM对象,任何需要dispose清理的对象)。第一个GC定位对象,但只安排它们完成。下一个GC运行它们。您可以在第一次GC之后调用WaitForPendingFinalizers来测试这是否为真-然后不需要两次GC

对我来说,我使用WinDbg和SOS dll来理解这些问题。您也可以在VisualStudio中加载SOS,但我更喜欢WinDbg。SOS dll允许您将对象转储到堆上,并查看它们为何是根对象(即什么对象使它们保持活动状态并需要进行处置)


并非每个人都有相同的技能,因此可以在这个问题中找到其他关于查找.net漏洞的建议:。

可能重复的问题并不是垃圾收集的工作方式。它不会立即释放内存。注意,这可能是重复的,但垃圾收集并不是这样工作的。它不会立即释放内存。注意。