如何在C#应用程序(DataTable dispose)中保持内存清晰?

时间:2014-07-31 20:18:17

标签: c# visual-studio-2012 datatable garbage-collection dispose

处理DataTable并清除C#应用程序中相关的所有RAM内存的最佳方法是什么?

我有一个简单的代码:

private void Form1_Load(object sender, EventArgs e)
{
    using (DataTable vDT = new DataTable())
    using (DataTable vDTsec = new DataTable())
    {
        vDT.Columns.Add("A");
        vDT.Columns.Add("B");
        vDT.Columns.Add("B_1");

        vDTsec.Columns.Add("A");
        vDTsec.Columns.Add("B");
        vDTsec.Columns.Add("E");

        for (int x = 1; x <= 1000000; x++)
        {
            vDT.Rows.Add(new object[] { x, "B" + x.ToString(), "C" + x.ToString() });
            vDTsec.Rows.Add(new object[] { x, "B" + x.ToString(), "E" + x.ToString() });
        }

        vDT.Dispose();
        vDTsec.Dispose();
    }

    GC.Collect();
    GC.WaitForFullGCApproach(100);
    GC.WaitForPendingFinalizers();
}

如果我在创建百万行之前设置断点,则应用程序的大小约为4MB: 1aa

创建所有行后,内存大幅增加(~428MB): 2aa

即使在处理了两个表之后,内存仍然在~428MB: 3aa

如何从程序中释放这些内存?

2 个答案:

答案 0 :(得分:3)

首先,您不必担心在任务管理器中看到的数字。所有这些意味着垃圾收集器尚未收集内存(或操作系统正在缓存内存),如果操作系统不需要它,GC可能会等待一段时间来收集它。

在应用程序中更好地控制内存使用(超出敏感对象管理)的唯一令人信服的理由是改善程序的性能特征。你这样做的方法是使用Object Pooling,这基本上意味着,不是破坏和重新创建对象,而是创建它们一次,然后重复使用它们,这样GC就不会收集。但是,如果您已经用尽所有其他技术来提高性能,那么只能使用它。

答案 1 :(得分:0)

您通常不应该自己调用垃圾回收。调用Dispose()并让GC做它的事情。 GC.Collect()尝试收集所有代。 GC是或可能很昂贵。大部分时间它处理得很好,我们不需要直接参与。

确保显式关闭和/或处理非托管对象(如数据库连接)。如果要将大量数据加载到内存中的数据表中,您认为需要强制收集,则可能需要重新考虑您的方法。我有兴趣了解你在做什么需要GC。