2016-02-21 52 views
0

我有一个垃圾收集是我应用程序中的主要瓶颈的情况。会发生什么情况是某些清理费用昂贵的对象 - 它们包含其他对象的数组。所以我想我会尝试回收这些物体。通常情况下,我不知道他们什么时候可以自由回收,所以我想我会重写Finalize,此时我会将它们放入缓存中以供下次需要创建时使用。问题解决了。或者是?这是一个覆盖最终确定的有效方案吗?

+0

不,我不会 - 最好将它们始终保存在缓存中,并使用一个标志来指示它们是否是空闲的(或将它们移动到* used * hashset或其他内容中) - 请参阅[here](https ://msdn.microsoft.com/en-us/library/system.object.finalize%28v=vs.110%29.aspx)请 – Carsten

+0

这是一个很好研究的问题。谷歌为“.net缓存终结者”。或用“对象池”替换“缓存”。基本上,这是不好的,因为GC不必为维护高效的缓存行为而努力。它可能过分收集或收集不足。澄清:这个方案可以工作,但它更多的是最后的解决方案。 – usr

+0

感谢您的回复。看起来我可以做的最好的事情就是只缓存我知道不再需要的实例,并让剩下的实例被垃圾收集。 –

回答

1

这是一个研究得很好的问题。谷歌为“.net缓存终结者”。或用“对象池”替换“缓存”。基本上,这是不好的,因为GC不必为维护高效的缓存行为而努力。它可能过分或不足。澄清:这个方案可以工作,但它更多的是最后的解决方案。

另外,您可能想以某种方式证明这些对象是性能问题的真正原因。没有用于.NET的GC分析器,它允许您精确定位单个对象的性能贡献。也许你可以用一种肮脏的方式快速将这个对象池合并在一起,并测量它们之间的差异

相关问题