gpt4 book ai didi

c# - 可以强制对象在第 1 代或第 2 代而不是第 0 代中被垃圾回收吗?

转载 作者:行者123 更新时间:2023-11-30 18:58:36 26 4
gpt4 key购买 nike

一位面试官问了我一个奇怪的问题,我找不到答案。

Is it possible to force an object to be garbage collected in Gen 1 or Gen 2 and not in Gen 0?

最佳答案

是的。

public class WillAlwaysBeCollectedInGen1or2
{
~WillAlwaysBeCollectedInGen1or2()
{
}
}

因为它有一个终结器,并且没有调用 GC.SuppressFinalize(this) 的代码,所以它总是会在终结队列中结束,而不是在它第一次符合收集条件时被收集,这意味着它将始终在除第一代之外的其他代中收集。

当然,由于我们通常希望发生相反的情况(尽快收集对象),这说明了为什么除非实际需要,否则不应定义终结器,并且应该始终调用 GC.SuppressFinalize(this) 如果一个对象处于终止没有做任何有用的状态(最明显的是它被显式处理,但也可能有其他情况)。

所以,这些知识的用处是这样的;知道不该做什么。

通过扩展,您可以强制在 Gen1 或 Gen2 中收集任意对象,只需在此类对象中持有对它的强引用:

public class PreventGen0Collection
{
private object _keptAlive;
public PreventGen0Collection(object keptAlive)
{
_keptAlive = keptAlive;
}
~PreventGen0Collection()
{
}
}

因为 PreventGen0Collection 本身至少在第 1 代之前被阻止收集,如上所述,传递给其构造函数的对象甚至无法在 GC 扫描中收集,因此将被传给下一代。

同样,这演示了要避免的代码; finalisable 不仅会提升一个对象,还会提升整个图。不要在不需要时使用终结器,并在可能时抑制终结器。

关于c# - 可以强制对象在第 1 代或第 2 代而不是第 0 代中被垃圾回收吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30302211/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com