【问题标题】:Is changed items from array go to Garbage Collection?数组中的更改项目是否进入垃圾收集?
【发布时间】:2012-05-02 18:32:31
【问题描述】:

我有两个类,第二个继承第一个。

然后我有这个:

First[] tab = new First[5];
tab[0] = new First();
tab[1] = new First();
tab[2] = new First();

我的问题是:如果我这样做:

tab[1] = new Second();

我第一次用来调用 tab[1] 的内存发生了什么?它去垃圾收集和内存是免费的?

如果没有,我该怎么做才能释放它?

任何帮助将不胜感激。

【问题讨论】:

    标签: c# .net garbage-collection clr


    【解决方案1】:

    从数组中替换对象会导致该对象不再被数组引用。

    与任何其他对象一样,如果没有其他根对象引用它,它最终将被垃圾回收。

    【讨论】:

    • 如果有对它的引用,它可以被 GC 处理,当对象 无法访问 时,它们有资格被 GC。您可以对它有一百个引用(包括循环),这些引用中没有一个可以被应用程序使用,它是垃圾。当然,弱引用(即使它们正在使用)也不会阻止 GC。
    【解决方案2】:

    当你执行时

    tab[1] = new Second();
    

    以前在tab[1] 中的First 实例不再被引用,并被标记为垃圾回收。

    在垃圾收集器运行之前,内存本身实际上不会再次可用,这不是立即的。

    这当然假设没有其他任何东西在引用该实例。

    大量关于 .NET 垃圾收集器及其工作原理的精彩文章,如果您 Google 的话。

    【讨论】:

      【解决方案3】:

      tab[1] 的“First”应该(最终)进入垃圾收集,因为没有其他变量指向该内存。

      【讨论】:

        【解决方案4】:

        此外,您还可以通过System.GC.Collect() 强制立即进行垃圾回收

        【讨论】:

        • GC.Collect 是一项高级功能,只能在非常特殊的情况下使用。不应该让刚刚接受垃圾收集概念的人知道它的存在。
        猜你喜欢
        • 2021-05-25
        • 1970-01-01
        • 2011-07-21
        • 2021-10-18
        • 1970-01-01
        • 1970-01-01
        • 2016-05-19
        • 1970-01-01
        • 2013-12-07
        相关资源
        最近更新 更多