处理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:
创建所有行后,内存大幅增加(~428MB):
即使在处理了两个表之后,内存仍然在~428MB:
如何从程序中释放这些内存?
答案 0 :(得分:3)
首先,您不必担心在任务管理器中看到的数字。所有这些意味着垃圾收集器尚未收集内存(或操作系统正在缓存内存),如果操作系统不需要它,GC可能会等待一段时间来收集它。
在应用程序中更好地控制内存使用(超出敏感对象管理)的唯一令人信服的理由是改善程序的性能特征。你这样做的方法是使用Object Pooling,这基本上意味着,不是破坏和重新创建对象,而是创建它们一次,然后重复使用它们,这样GC就不会收集。但是,如果您已经用尽所有其他技术来提高性能,那么只能使用它。
答案 1 :(得分:0)
您通常不应该自己调用垃圾回收。调用Dispose()并让GC做它的事情。 GC.Collect()尝试收集所有代。 GC是或可能很昂贵。大部分时间它处理得很好,我们不需要直接参与。
确保显式关闭和/或处理非托管对象(如数据库连接)。如果要将大量数据加载到内存中的数据表中,您认为需要强制收集,则可能需要重新考虑您的方法。我有兴趣了解你在做什么需要GC。