【问题标题】: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
{
}
这是上述程序的输出: