这是覆盖 Finalize 的有效场景吗?

Is This a Valid Scenario for Overriding Finalize?

在我的应用程序中,垃圾回收是一个主要瓶颈。发生的情况是某些对象的清理成本很高——它们包含其他对象的数组。所以我想我会尝试的是回收这些物品。通常情况下,我不知道它们什么时候可以自由回收,所以我想我会覆盖 Finalize,此时我会将它们放入缓存中,以便下次需要创建时使用。问题解决了。或者是?

这是一个经过深入研究的问题。 Google 用于“.net 缓存终结器”。或者将 "cache" 替换为 "object pool"。基本上,这很糟糕,因为 GC 不必以维护有效的缓存行为为目标。它可能收集过多或收集不足。澄清一下:这个方案可以工作,但它更像是最后的解决方案。

此外,您可能想以某种方式证明这些对象是导致性能问题的真正原因。没有适用于 .NET 的 GC 分析器可以让您查明单个对象的性能贡献。也许你可以用一种肮脏的方式快速拼凑这个对象池并测量差异。