正在释放静态冲突中的托管对象

本文关键字:对象 冲突 释放 静态 | 更新日期: 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。