内存不是由DataGridView发布的?

时间:2014-03-13 08:01:51

标签: c# winforms datagridview memory-leaks garbage-collection

伙计我在C#中有一个简单的Windows窗体应用程序。它只有2个表格。一个表单只有一个按钮,而另一个表单有DataGridView和一个按钮。请查看两种表格的代码:

代码Form1,有一个显示Form2的按钮。

public partial class Form1 : Form
 {
    public Form1()
    {
        InitializeComponent();
    }

    private void showFrom2_Click(object sender, EventArgs e)
    {
        Form2 frm2 = new Form2();
        frm2.Show();
    }
}

Form2代码,其中DataGridView由GUID填充,一次测试10k行。

public partial class Form2 : Form
{
    public Form2()
    {
        InitializeComponent();
    }

    private void populateGrid_Click(object sender, EventArgs e)
    {
        DataTable dt = new DataTable();
        for (int i = 0; i < 10; i++)
        {
            dt.Columns.Add(i.ToString());
        }
        for (int j = 0; j < 10000; j++)
        {
            DataRow row = dt.NewRow();
            for (int k = 0; k < 10; k++)
            {
                row[k] = Guid.NewGuid().ToString();
            }
            dt.Rows.Add(row);
        }
        dataGridView1.DataSource = dt;
    }

    private void closeForm2_Click(object sender, EventArgs e)
    {
        dataGridView1.Dispose();
        this.Close();
    }

现在每当我填充DataGridView然后关闭Form2。内存未释放。如果我继续填充网格并关闭Form2&#34; MULTIPLE&#34;没有关闭整个应用程序的时间,我的系统内存不足(我有1 GB的RAM)。打电话给dataGridView1.Dispose();时,不应该GarbageCollector完成他的工作并释放记忆吗?

我想要的是每当我关闭Form2时,应该在系统中释放内存。

注意:我正在通过TaskManager监控内存(我知道它并没有显示正确的内存消耗量,但是如果我保留内存不足则无关紧要填充网格。内存未被释放)。我甚至试图在关闭按钮上拨打GC.Collect()(这不是一个好的电话,也没有任何帮助)。

另外,如果有人能告诉我如何监控&#34;真实的&#34;我会很感激。应用消费。我在某处读到了你使用.Net性能计数器。那是什么?

P.S。不要问为什么我用10k行填充网格。我只是为测试目的而做。

2 个答案:

答案 0 :(得分:1)

不要永远打电话给GC.Collect()

一旦应用程序即将达到RAM限制,GC将自动调用,但如果您的应用程序需要更多系统可访问的RAM,则会出现OutOfMemory异常。

答案 1 :(得分:-1)

  

调用dataGridView1.Dispose();不应该GarbageCollector做他的工作,并释放   存储器?

不,一个人与另一个人无关。

  • Dispose用于非托管资源(不是托管内存,文件句柄)。
  • GC在需要时运行,而不是在每次轻微处理时运行。
  

我甚至试图在关闭按钮上调用GC.Collect()(这不是一个好的调用它   也没有帮助。

这是一个愚蠢的呼唤,而不是一个好的呼叫 - 它完全掩盖了GC的统计数据,绝不应该在非常具体的问题和调试之外调用。

抓住内存分析器并找出原因。内存分析器将允许您查看哪些引用使对象保持活动状态,以及实际使用内存的内容。我有点打赌它不是你的想法 - 而且错误要么根本不是你的想法,要么至少与你所展示的代码无关。

保持内存存活的表单中的一般罪魁祸首是错过引用和事件(因为事件意味着调用者必须有一个指向被调用对象的指针)。

你展示的代码很好。

如果您在获取memoryprofiler时遇到问题 - 我更喜欢memprofiler(http://memprofiler.com/) - 没有关联,只是满意的用户。他们有7天免费试用。