c# – .NET垃圾收集行为(使用DataTable obj)
发布时间:2020-12-16 00:15:27 所属栏目:百科 来源:网络整理
导读:我想知道为什么在创建一个非常简单的DataTable然后将其设置为null后,垃圾收集不会清除该DataTable使用的所有内存.这是一个例子.变量Before应该等于Removed但它不是. { long Before = 0,After = 0,Removed = 0,Collected = 0; Before = GC.GetTotalMemory(tru
我想知道为什么在创建一个非常简单的DataTable然后将其设置为null后,垃圾收集不会清除该DataTable使用的所有内存.这是一个例子.变量Before应该等于Removed但它不是.
{ long Before = 0,After = 0,Removed = 0,Collected = 0; Before = GC.GetTotalMemory(true); DataTable dt = GetSomeDataTableFromSql(); After = GC.GetTotalMemory(true); dt = null; Removed = GC.GetTotalMemory(true); GC.Collect(); Collected = GC.GetTotalMemory(true); } 给出以下结果. Before = 388116 After = 731248 Removed = 530176 Collected = 530176 解决方法
几个原因:
GC运行在自己的甜蜜时间;通常当运行时内存不足时.这就是为什么像DB连接那样处理对象很重要;是的,他们最终会被释放,但直到GC才能运行. GC.Collect()不直接运行GC线程;它安排了一系列的GC.同样,运行时通常只在它注意到沙箱变得混乱或者有大量空闲时间时才运行GC. GC.Collect()是一个覆盖,其行为与发生其中一个自动触发器的行为相同.它不是内联调用来运行垃圾收集算法;这将导致明显的性能下降. GC在自己的线程中运行.因此,GC静态方法提供的信息基于调用者在调用时可用的内容.您在GC仍在工作时,或者甚至在它开始之前最后一次调用GetTotalMemory,因此内存数字尚未更新GC正在最终确定的内容. 总之,GC的设计主要是放手. GC.Collect()相当于挂在酒店门口的“请服务”标志;这是一个建议,也许现在是清理的好时机. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |