我的应用程序24X7工作,我使用DataTable进行数据处理。
我每次都需要处理DataTable。我使用了Dispose和Clear方法,但是当我调试代码时,内容只被清除,其实例仍在内存中。
如何在不依赖GC的情况下将其从内存中删除?
提前致谢..
编辑: 这是我的代码原型。我是以两种方式完成的。
1 //Methord 1
2 while (true)
3 {
4 DataTable dt = new DataTable();
5 dt.Columns.Add("City", typeof(string));
6 dt.Rows.Add("ABC");
7 dt.Rows.Add("XYZ");
8 dt.Rows.Add("PQR");
9 dt.Rows.Add("LMN");
10 dt.Dispose();
11 }
12 //Methord 2
13 while (true)
14 {
15 using (DataTable dtable = new DataTable())
16 {
17 dtable.Columns.Add("City", typeof(string));
18 dtable.Rows.Add("ABC");
19 dtable.Rows.Add("XYZ");
20 dtable.Rows.Add("PQR");
21 dtable.Rows.Add("LMN");
22 }
23 }
数据表如何处理?如果你用断点检查,你可以看到数据表'dt'在调用dispose()后仍然有值。即使执行第11行仍然存在值。我需要在执行第12行之前释放该内存(或之前)第二次迭代)。我该怎么办?
答案 0 :(得分:2)
如果将对数据表的每个引用设置为nothing / null,则可以对基础数据进行垃圾回收。当一个对象成为孤立对象时,dotnet框架会在感觉合适时自动进行垃圾收集。
您可以告诉垃圾收集器手动收集,但它只会收集代码中没有引用的对象。 http://msdn.microsoft.com/en-us/library/xe0c2357.aspx
dotnet GC的工作原理摘要。 http://dotnetfacts.blogspot.com/2008/05/how-garbage-collector-works-part-1.html
如果垃圾收集器没有释放内存,可能是因为您可能编写的其他对象,Ui控件/其他业务对象引用了数据表中的行数据。例如,您正在显示行数据,或者您已将行传递到另一个对象,并且它具有对此行的引用。
如果您的内存不断增加,则会出现内存泄漏,即您拥有越来越多的引用它们的对象,并且框架无法收集此数据,因为它认为它正在被使用。您将需要查看您的代码并尝试找出它泄漏的原因,内存分析器可能会有所帮助。
答案 1 :(得分:1)
如果不依赖GC,则无法将其从内存中删除。它将取决于GC何时以及如何释放内存。 GC以不确定的方式工作,这意味着您无法确定GC何时实际释放实例
您应该确保在不再需要DataTable时不要保留任何参考。如果您已正确完成该部分,即除非有必要,否则没有对DataTable的引用,那么您就是好的并且在GC上保持休息
答案 2 :(得分:1)
我怀疑尝试重建GC无论如何都是一个好设计。 为什么不运行一个24/7运行的循环任务,只是将Process作为一个新线程启动?线程完成后你可以销毁它,结果你没有内存问题。
答案 3 :(得分:0)
垃圾收集将需要完全处理它,但如果您不再需要它,您可以始终将其设置为空。
//do some stuff with the table
//don't need it any longer so set it null
table = null;
答案 4 :(得分:0)
您可以始终将数据表本身包装在using块中,而不是调用dispose方法:
using (DataTable dt = new DataTable())
{
//Do work here
}
这可以确保在对象本身超出其范围时清理它。
MSDN Article本身是一个显而易见的资源,如果您以前从未使用过它,但这个想法非常简单。