对于不了解GC并且从未使用过它(或者我认为没有这个需求)的人来说,它通常用于什么情况?如果我提高自己的技能并学习更多关于GC的知识,我或我的系统将如何受益?
更新 ...我如何让GC的工作更容易?
对于不了解GC并且从未使用过它(或者我认为没有这个需求)的人来说,它通常用于什么情况?如果我提高自己的技能并学习更多关于GC的知识,我或我的系统将如何受益?
更新 ...我如何让GC的工作更容易?
通常情况下,使用垃圾回收的方法是不使用它,而是让CLR为您处理所有事情。
如何让垃圾回收更容易?最简单的方法是不要干扰它的工作,让它自行优化运行。
建议研究何时使用C#中的终结器,这是您可以帮助GC的一个领域。
了解大对象堆也可能会有所帮助,因为它可能会引起问题。
http://techiemate.blogspot.com/2009/04/garbage-collection-in-net.html
使用垃圾回收器的最佳方式是...
不要试图使用它!
让它自己运作。几乎每次人们尝试通过操作垃圾回收器来使其“更高效”,都会抑制它,并使其在工作中变得更糟。
为了使GC更容易,始终在支持IDisposable接口的任何对象上调用Dispose()。
Dispose
和IDisposable
完全无关。 - LukeHDispose
和IDisposable
是允许跳过需要终止器的类的机制,从而使垃圾收集器更容易处理。其他类应该没有问题... - Haas编写代码时需要考虑垃圾回收的几个要点:
当您不再使用事件处理程序时,请始终确保取消注册。这是对象被保持活动状态远超其预期寿命的最常见方式,如果已释放的对象正在调用事件处理程序,则还可能导致错误。
如果您正在与非托管代码进行交互,则需要更加注意与非托管代码共享托管内存的情况。您可能需要使用固定和/或GC.KeepAlive来帮助GC了解您的非托管代码需要什么。尽量将固定保持在最小限度,因为这会使GC变得更加困难。
您几乎永远不需要实现终结器。如果类确实具有终结器,则应实现与IDisposable相同的清理,并在处理后调用GC.SuppressFinalize(this)
,因为这有助于GC有效地清理您的类。
如果你没有注意到你正在使用GC,那么你正在使用它,并且你正在正确地使用它。
只有当你错误地使用它时,才需要了解GC的内部工作原理。
了解它的工作原理总是有用的;但在大多数情况下,您不需要过于担心。
当您开始分配非托管资源(或具有此类资源的对象)时,值得阅读IDisposable pattern,以便您可以控制资源何时被释放(或者如果您想在与同行交谈时显得知识渊博,则称之为“确定性终结”)。
如果任何线程在本地变量中持有对对象的引用,或者任何全局变量持有对对象的引用,或者被认为是“已使用”的对象在任何字段中持有对它的引用,则将考虑该对象已经被“使用”。编译器通常可以判断一个持有对对象引用的本地变量是否实际上不会被使用,但它不能对全局变量或对象字段做出这样的判断。如果即将有用的对象持有一个从未再次实际使用的对象引用,则该引用应设置为null(在VB中为Nothing)。如果不这样做,无用的对象将与有用的对象同生共死。如果有用的对象像应用程序的主窗体这样,结果可能是一个持续存在的内存泄漏,只要应用程序保持打开状态。