在调试模式下存在lambda表达式/匿名委托的情况下,GC不会收集弱引用的对象

时间:2018-08-26 19:57:46

标签: c# garbage-collection delegates clr weak-references

请考虑以下独立的C#代码段:

using System;

namespace ConsoleApp1
{
    class Program
    {
        static void Main()
        {
            var wr = new WeakReference(new object());
            GC.Collect(GC.MaxGeneration, GCCollectionMode.Forced, true, true);
            Console.WriteLine(wr.IsAlive);
            GC.KeepAlive((Action)(delegate { })); // ***
        }
    }
}

该项目针对使用Visual Studio 2017社区版本15.7.2构建的.NET Framework 4.6.1。 (使用默认的控制台应用程序模板。)

  • 当我在Debug / Any CPU(默认)中构建项目时,结果为True
  • 当我在Release / Any CPU中构建它时,结果为False
  • ***注释掉行时,结果始终是False
  • 我对对象可及性的基本分析说,结果应始终为False

为什么GC不会收集弱引用的对象?我是否缺少某些东西,例如,在调试模式下会发生一些不寻常的事情?

注意:

  1. 此问题不是that question的重复,因为该问题与COM对象垃圾收集有关,该操作涉及互操作和引用计数(在COM中)。相反,这个问题在CLR中纯粹是一个GC问题。这个问题比那个问题还更整洁。

0 个答案:

没有答案