正在释放静态冲突中的托管对象
本文关键字:对象 冲突 释放 静态 | 更新日期: 2023-09-27 17:59:33
释放静态/共享类中的托管对象的最佳实践是什么?
我持有3个大数据表,大多数时候都不使用它们。
GC不会发布它们,因为它们是静态的——我说得对吗?
我想知道在ReleaseDatatables()
中将它们设置为null是否有用,或者我只是在浪费时间?
谢谢。
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;
}
GC在计算是否可以释放内存的信息时会检查"根"。如果有任何引用类型的变量绑定到根,则不会收集对象。
你的静态对象就是这个根的一部分,所以如果你将变量设置为null,你的大数据就不会绑定到根,而是会被释放。
此外,您可以在此处查看WeakReference对象类型这是您案例的另一种方法
更新
但你的解决方案似乎不是我的最佳实践。从数据库表中读取所有数据是非常危险的,因为你不知道那里存储了多少数据。最好将属性设为IEnumerable,并在没有缓存的情况下对数据块使用"yield return"。当然,这取决于你想做什么的背景。
是。但是静态类不需要发布。
静态类不需要释放,因为它们不是对象,也不消耗内存。
静态类中的静态字段是消耗内存的对象。它们不会被释放,因为在应用程序关闭之前它们是可访问的。如果您想释放一些内存,请将字段设置为null。