C# Winforms中的内存使用
我有两个表单的非常简单的应用程序(创建来测试内存)。解决方案有三个项目。第一个有表格,第二个是DAL,第三个是ComonLib (所有这些内存数据都来自任务管理器。问题末尾有4个内存分析器图像的URL) 当我运行我的应用程序时,内存使用量约为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
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漏洞的建议:。可能重复的问题并不是垃圾收集的工作方式。它不会立即释放内存。注意,这可能是重复的,但垃圾收集并不是这样工作的。它不会立即释放内存。注意。