【发布时间】:2016-03-10 20:12:55
【问题描述】:
我试图了解当对象不再被使用时 GC 的行为,我的测试是对对象(使用后)不做任何事情,但它不起作用,对象的析构函数从未被调用。
我创建了一个示例程序,试图等待对象被销毁,但运行 4 小时后没有任何反应。
注意:我知道如果我将对象设置为 null,GC 会收集它,但我只想看看 GC 本身收集对象的“正常”方式。
using System;
using System.Collections.Generic;
using System.IO;
using System.Threading;
using System.Threading.Tasks;
namespace ConsoleApplication1
{
internal class Program
{
private const string FilePath = @"C:\objLifeCycle.txt";
private static void Main(string[] args)
{
var result = GetList();
Console.WriteLine("Results received! Object Id: [{0}] time: [{1}]", result.ObjId, DateTime.Now);
//result = null;
Task.Factory.StartNew(() =>
{
while (true)
{
Thread.Sleep(2000);
Console.WriteLine("...");
GC.Collect();
}
});
Console.ReadKey();
}
private static LinkList GetList()
{
return new LinkList(FilePath) { "link1", "link2", "link3" };
}
}
}
internal class LinkList : List<string>
{
internal string ObjId { get; set; }
internal string FilePath { get; set; }
internal LinkList(string filePath)
{
ObjId = Guid.NewGuid().ToString();
FilePath = filePath;
WriteFile($"Object LinkList with Id [{ObjId}] has been created at [{DateTime.Now}]");
}
~LinkList()
{
WriteFile($"Object LinkList with Id [{ObjId}] has been destroyed at [{DateTime.Now}]");
Environment.Exit(0);
}
private void WriteFile(string line)
{
var sw = new StreamWriter(FilePath, true);
sw.WriteLine(line);
sw.Close();
}
}
【问题讨论】:
-
通过向 LinkList 类添加析构函数,实例化的对象会立即提升到 gen1 堆。 Gen1 堆收集不像 gen0 堆收集那样频繁执行,并且由于您可能有足够的可用内存,因此对于此应用程序,它们很可能永远不会发生。
标签: c# garbage-collection c#-6.0