【问题标题】:Is This a Valid Scenario for Overriding Finalize?这是覆盖 Finalize 的有效方案吗?
【发布时间】:2016-02-21 14:04:24
【问题描述】:

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

【问题讨论】:

  • 不,恐怕不会 - 最好将它们一直保存在缓存中并使用标志来指示它们是否空闲(或将它们移动到 used 哈希集中或其他) - 请参阅here
  • 这是一个经过充分研究的问题。谷歌搜索“.net 缓存终结器”。或者将“缓存”替换为“对象池”。基本上,这很糟糕,因为 GC 不必为您维护有效的缓存行为。它可能会过度或收集不足。澄清一下:这个方案可以工作,但它更像是最后的解决方案。
  • 感谢您的回复。看起来我能做的最好的事情就是只缓存我知道不再需要的实例,然后让其余的实例被垃圾收集。

标签: .net finalize


【解决方案1】:

这是一个经过充分研究的问题。谷歌“.net 缓存终结器”。或者将“缓存”替换为“对象池”。基本上,这很糟糕,因为 GC 不必为您维护有效的缓存行为。它可能会过度收集或收集不足。澄清一下:这个方案可以工作,但它更像是最后的解决方案。

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

【讨论】:

    猜你喜欢
    • 2014-06-10
    • 2013-08-15
    • 1970-01-01
    • 2011-03-05
    • 1970-01-01
    • 2020-05-04
    • 2012-07-16
    • 2023-03-12
    • 2011-01-27
    相关资源
    最近更新 更多