终结器如何增加C#中对象的寿命?

问题描述 投票:0回答:1

我正在阅读有关C#内存管理的书,其中说:

重要的是要知道终结器会延长寿命一个对象。由于完成代码也必须运行,因此.NET框架在特殊的终结处理中保留对对象的引用队列。附加线程在认为的某个时间运行所有终结器根据执行上下文适当。这延迟了垃圾具有终结器的类型的集合。

据我所知,终结器只能在垃圾回收上运行,而不是在垃圾回收上运行。因此,如何延迟垃圾回收?

c# memory-management memory-leaks garbage-collection finalizer
1个回答
0
投票

通过评论和删除的答案发布的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
{

}

这是上面程序的输出:enter image description here


0
投票

the documentation的外观清楚地表明了这一点:

© www.soinside.com 2019 - 2024. All rights reserved.