CLR分析器还可以显示哪些方法分配比你预期的更多的存储,并能揭示情况下,你无意中保留引用,否则会被GC回收无用的对象图。 (一个常见的问题设计模式是软件缓存或查找表不再需要或安全后重建项目。可悲的是,当一个高速缓存保持对象图活着过去其使用寿命。取而代之的是, 一定要空出来的引用对象不再需要 ) - 书写更快的托管代码
我不认为我真的以往任何时候都归零了参考。 我假设你并不总是需要做到这一点,但我想有还很多时候重要的是要记住要做。 但是,什么情况是什么? 当你要空出的参考?
CLR分析器还可以显示哪些方法分配比你预期的更多的存储,并能揭示情况下,你无意中保留引用,否则会被GC回收无用的对象图。 (一个常见的问题设计模式是软件缓存或查找表不再需要或安全后重建项目。可悲的是,当一个高速缓存保持对象图活着过去其使用寿命。取而代之的是, 一定要空出来的引用对象不再需要 ) - 书写更快的托管代码
我不认为我真的以往任何时候都归零了参考。 我假设你并不总是需要做到这一点,但我想有还很多时候重要的是要记住要做。 但是,什么情况是什么? 当你要空出的参考?
你只需要做的是当变量保持基准是要留“活着”,但你不想引用本身,以防止垃圾收集。 换句话说,如果对象A持有引用对象B,并且你不需要B中所述以上,但A将活着的其他原因。 另一个常见的例子是静态变量,分别是“活着”,只要在AppDomain是。
对于局部变量它几乎从来不需要,因为GC可以检测代码的最后可能的地步变量将被访问。 但是,如果您使用的第一个迭代期间在循环外声明的变量,但你知道你不会需要它后续的迭代,你可以设置为null,以帮助对象有资格获得GC前面。
在我的经验,这是非常罕见的,发现自己在这种情况下。 我很少刻意设置变量为null,GC的缘故。 通常,一个对象内的所有成员变量,直到对象本身就符合GC是“有用的”。 如果你发现自己有成员变量这是不是为对象的整个生命周期有用,你可能想看看是否表示与设计中的问题。
这一点很重要,如果你长期生活的对象(比如在您的报价缓存例子)抱着短暂的对象的引用(如缓存项)。 长寿命对象的其他例子可以是单一对象,在Windows主窗体实例窗体应用程序,ASP.NET应用程序等应用实例
我想一个补充另一种常见pitfull:短命的对象订阅由长期生活的对象发布的事件。 由于事件发布者认为给所有用户一个参考,(即只需要毫秒像如ASP.NET页面或控件实例)的用户将不能,如果你不退订收集。
你应该空出你不再需要时,你知道他们不会被垃圾收集,否则为对象的引用。
如果您有有效的Java书,看第5项,有是有内存泄漏,因为对象的引用不归零出堆栈实现的一个例子。 如果没有那本书呢,你可以看一下谷歌图书的部分在这里 。