Рассмотрим следующий автономный фрагмент 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 { })); // ***
}
}
}
Проект ориентирован на .NET Framework 4.6.1, созданный с помощью Visual Studio 2017 Community версии 15.7.2.(Используйте шаблон консольного приложения по умолчанию.)
- Когда я собираю проект в Debug / Any CPU (по умолчанию), результат равен
True
. - Когда я его строюОтпустите / Любой ЦП, результат будет
False
. - Когда закомментируйте строку с
***
, результат всегда будет False
. - Мой базовый анализ с достижимостью объекта говоритрезультат всегда должен быть
False
.
Почему GC не собирает объект со слабой ссылкой?Я что-то упускаю, например, что-то необычное может произойти в режиме отладки?
Примечания:
- Этот вопрос не является дубликатом этого вопроса , поскольку этот вопрос касается сбора мусора COM-объектов, который включает взаимодействие и подсчет ссылок (в COM).В отличие от этого, этот вопрос является чисто проблемой GC в CLR.Эта проблема также важнее этой проблемы.