【问题标题】:How finalizer increases the life of an object in C#?终结器如何增加 C# 中对象的寿命?
【发布时间】:2019-12-13 12:33:24
【问题描述】:

我正在阅读一本关于 C# 内存管理的书,上面写着:

重要的是要了解终结器可以延长寿命 的一个对象。因为最终确定代码也必须运行,所以 .NET 框架在特殊的终结中保留对对象的引用 队列。一个额外的线程在认为的时间运行所有终结器 根据执行上下文适当。这会延迟垃圾 具有终结器的类型的集合。

据我所知,终结器只会在垃圾收集上运行,而不是在它之前运行。那么,它怎么能延迟它的垃圾回收呢?

【问题讨论】:

标签: c# memory-management memory-leaks garbage-collection finalizer


【解决方案1】:

浏览完cmets贴的MSDN链接和删掉的答案,下面是整个过程的详细介绍:

当一个可终结对象(被 GC)发现为死时,它的终结器被放入队列中,以便执行其清理操作,但对象本身被提升到下一代。因此,您必须等到该代发生的下一次垃圾收集(不一定是下一次垃圾收集)才能确定对象是否已被回收。

以下是演示相同的代码:

using System;
class Program
{
    static void CreateDestructorReferences()
    {
        for (int i = 0; i < 1000; i++)
            _ = new Destructor();
    }
    static void CreateWithoutDestructorReferences()
    {
        for (int i = 0; i < 1000; i++)
            _ = new WithoutDestructor();
    }
    static void Main(string[] args)
    {
        CreateDestructorReferences();
        DemoGCProcess("****Objects With Destructors*****");
        CreateWithoutDestructorReferences();
        DemoGCProcess("****Objects Without Destructors*****");
        Console.ReadLine();
    }

    private static void DemoGCProcess(string text)
    {
        Console.WriteLine(text);
        var memory = GC.GetTotalMemory(false);
        GC.Collect(0);
        GC.WaitForPendingFinalizers();
        var memory1 = GC.GetTotalMemory(false);
        Console.WriteLine("Memory freed on first Garbage Collection on Generation 0:" + (memory - memory1));
        GC.Collect(1);
        var memory2 = GC.GetTotalMemory(false);
        Console.WriteLine("Memory freed on second Garbage Collection on Generation 0 and Generation 1:" + (memory1 - memory2));
    }
}
class Destructor
{

    ~Destructor()
    {
        //Console.WriteLine("Destructor is called");
    }
}
class WithoutDestructor
{

}

这是上述程序的输出:

【讨论】:

    猜你喜欢
    • 2013-01-28
    • 2011-03-21
    • 1970-01-01
    • 1970-01-01
    • 2017-02-03
    • 2018-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多