直觉告诉我,Dispose 旨在用于运行用户定义的代码,这些代码会释放不会自动释放的资源,例如文件句柄、网络句柄、数据库连接等。
GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();
他还说
请注意,.NET 垃圾收集器是非常不可预测的,它可能会在清理所有符合收集条件的旧实例之前创建对象的一些实例。一种确定的方法(无需借助内存分析器)是在终结器中放置一个断点。
我通过上面的GC相关代码释放内存并收集所有未声明的对象或对象超出范围。
他还说永远不要在生产环境中使用上面的 GC 相关代码,但没有解释原因......所以告诉我如果有人使用下面这些 GC 相关代码会有什么危害GC.Collect();
GC.WaitForPendingFinalizers(); GC.Collect();
无论如何,寻找深入的知识。谢谢
GC
从不打电话Dispose
方法,只要您在终结器中手动执行此操作
的工作流程GC
很简单,但是很多人都感到困惑,让我们把东西放在他们的位置上
Dispose
不相关GC
. Dispose
是一个方法,在接口中定义IDisposable
,与其他接口一样,类可以实现该方法并让用户能够调用该方法。 GC根本不关注这个接口。
一旦我们在.NET中有自动内存管理,并且我们知道GC很好地完成了他的工作,它会自动清除所有托管资源,因此没有理由向用户提供Dispose
清除托管资源的方法。因此,通常 Dispose 用于清除非托管资源,但没有人阻止您取消订阅全局事件作为示例,或者为嵌套对象调用 Dispose(请注意,全局事件几乎总是不好的做法:))
另一方面,GC
知道Finalizer
, 而如果Finalizer
exists GC
将对象处置推迟到下一次收集,然后调用Finalizer
清除内存之前。为了将配置代码放在一处,程序员通常创建Dispose(bool)
并从调用此方法Finalizer
and IDisposable.Dispose
方法。这里您需要注意,如果调用来自 Finalizer,则不允许您访问托管资源,因为 GC 不保证任何处置顺序,并且该资源可能已经处于无效状态。这就是所谓的处置模式 http://msdn.microsoft.com/en-us/library/b1yfkh5e%28v=vs.110%29.aspx.
关于生产中的 GC 调用,是的,不建议这样做,因为一般 GC 的工作都很好,而且由于 GC.Collect 是昂贵的操作,因此在我们决定进行自动收集之前,没有理由为 GC 引擎烦恼。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)