在静态clasess中释放托管对象

时间:2016-08-02 08:48:13

标签: c# .net vb.net memory-management

在静态/共享类中释放托管对象的最佳做法是什么?

我持有3个大型数据表,大部分时间都不使用它们。

GC不会释放它们,因为它们是静态的 - 我是对的吗?

我想知道在public static class Helpers { private static DataTable _branchDT; public static DataTable branchDT { get { if (_branchDT == null) { _branchDT = new DataTable(); _branchDT = Orange.ProjectManagment.DAL.Database.getDataset("SELECT * FROM Branches").Tables[0]; return _branchDT; } else { return _branchDT; } } set { _branchDT = value; } } private static DataTable _departmentDT; public static DataTable departmentDT { get { if (_departmentDT == null) { _departmentDT = new DataTable(); _departmentDT = Orange.ProjectManagment.DAL.Database.getDataset("SELECT * FROM Departments").Tables[0]; return _departmentDT; } else { return _departmentDT; } } set { _departmentDT = value; } } private static DataTable _TeamsDT; public static DataTable TeamsDT { get { if (_TeamsDT == null) { _TeamsDT = new DataTable(); _TeamsDT = Orange.ProjectManagment.DAL.Database.getDataset("SELECT * FROM Teams").Tables[0]; return _TeamsDT; } else { return _TeamsDT; } } set { _TeamsDT = value; } } /// <summary> /// setting all datatables to null in order to free memory or to make them refresh them self in the next call to get property method /// /// </summary> public static void ReleaseDatatables() { // datatables set to null, hence next call to them they will refresh via new query to db in get prop method branchDT = null; departmentDT = null; TeamsDT = null; } 中将它们设置为null会有用还是我只是在浪费时间?

谢谢。

{{1}}

2 个答案:

答案 0 :(得分:1)

GC检查&#34;根源&#34;在计算有关是否可以释放内存的信息时。如果任何引用类型变量与根绑定,则不会收集对象。

你的静态对象属于这个根,所以如果你为变量设置null,那么你的大数据就不会被绑定到根,而是会被释放。

另外,您可以查看WeakReference object types here 这是您案件的另一种方法

<强>更新

但是你的解决方案对我来说似乎不是最好的做法。读取db表中的所有数据非常危险,因为您不知道那里存储了多少数据。让你的属性IEnumerable并使用&#34; yield return&#34;没有这个缓存的大量数据。取决于你当然要做的事情。

答案 1 :(得分:1)

是。但是静态课程不需要发布。

静态课程不需要发布,因为它们不是对象,也不会消耗内存。

静态类中的静态字段是消耗内存的对象。他们不会被释放,因为在应用程序关闭之前它们是可访问的。 如果要释放一些内存,请将该字段设置为null。