c# - GC.Collect() 没有立即收集?

标签 c# garbage-collection destructor finalizer

在聊天讨论的过程中,我编写了这个控制台应用程序。

代码:

using System;

class Program
{
    static void Main(string[] args)
    {
        CreateClass();
        Console.Write("Collecting... ");
        GC.Collect();
        Console.WriteLine("Done");
    }

    static void CreateClass()
    {
        SomeClass c = new SomeClass();
    }
}

class SomeClass
{
    ~SomeClass()
    {
        throw new Exception();
    }
}

结果:

Collecting... Done

Unhandled Exception: System.Exception: Exception of type 'System.Exception' was
thrown.
   at SomeClass.Finalize()

我本以为应用会在 Done 打印出来之前崩溃。

我不太在乎怎么做。我的问题是,为什么不呢?

最佳答案

具有终结器的对象无法在单个垃圾回收过程中被回收。这些对象被移动到 f-reachable 队列,并保留在那里直到调用终结器。只有在那之后,它们才能被垃圾收集。

下面的代码更好,但无论如何你都不应该依赖它:

GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();

此外,即使是出于测试目的,在终结器中抛出异常对我来说也太残酷了。

此外,终结器的有趣副作用:如果在终结器中存储 this 引用(将其分配给某个静态变量)。

关于c# - GC.Collect() 没有立即收集?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11354086/

相关文章:

c++ - move ctor和 move dtor

javascript - 如何调试 Chrome Javascript 中 GC 事件之间看似长时间的停顿

c++ - 如何处理 DLL 导出接口(interface)中的析构函数

c# - 非泛型类中的泛型方法

c# - 编译器错误 CS0542 : member names cannot be the same as their enclosing type 的解决方法

javascript - 了解 JavaScript 中的内存管理,Mozilla

c# - 我是否在 C# 函数中适本地关闭了这个 SQL 连接?

c++ - 我需要显式调用基本虚拟析构函数吗?

c# - 使用一个 observable 作为时钟来测试另一个是否超时

c# - 如何知道 Windows 应用商店应用类型可能抛出什么类型的异常?