我正在阅读有关C#内存管理的书,其中说:
重要的是要知道终结器会延长寿命一个对象。由于完成代码也必须运行,因此.NET框架在特殊的终结处理中保留对对象的引用队列。附加线程在认为的某个时间运行所有终结器根据执行上下文适当。这延迟了垃圾具有终结器的类型的集合。
据我所知,终结器只能在垃圾回收上运行,而不是在垃圾回收上运行。因此,如何延迟垃圾回收?
通过评论和删除的答案发布的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
{
}
the documentation的外观清楚地表明了这一点: