MSDN говорит для GC.Collect()
Weird поведения .NET сборщик мусора
Всех объектов, независимо от того, как долго они были в памяти, является считается для сбора; Однако объекты, на которые ссылаются в код не собран. Используйте этот метод, чтобы заставить систему попытаться восстановить максимальный объем доступной памяти.
Таким образом, я ожидал, что класс Child, который все еще упоминается в классе родителя, не будет собран до того, как будет получен Parent.
Но странно, что он МОЩНО собран до того, как собирается родитель. Это не имеет никакого смысла для меня.
Скомпилируйте следующий код на VS2010 и запустите его на фреймворке 4.0. Что я получаю это:
using System;
namespace GarbageCollector
{
class Child
{
public bool bInUse = true;
public void Dispose()
{
Console.WriteLine("Child finished by Parent.");
bInUse = false;
}
~Child()
{
bInUse = false;
}
}
class Parent
{
Child child = new Child();
~Parent()
{
if (!child.bInUse)
Console.WriteLine("Finalizing Child that is still in use in a Parent!");
child.Dispose();
}
}
class Program
{
static void Main(string[] args)
{
while (true)
{
for (int i=0; i<10; i++)
{
Parent P = new Parent();
}
GC.Collect();
}
}
}
}
Может кто-нибудь объяснить мне, что здесь происходит?
EDIT:
Я уже нашел, как решить эту проблему. Если вы хотите получить доступ к членам класса в Finalizer вашего класса, это может быть проблемой, если у этих членов также есть Finalizer. В этом случае участники могут уже быть мертвыми до того, как Finalizer вашего класса сможет получить к ним доступ, потому что GarbageCollector уничтожает их в ЛЮБОМ порядке. (Ребенок до рождения ребенка или ребенка после рождения)
НО, если вы получаете доступ к членам класса, у которых нет собственного финализатора, эта проблема не появляется.
Итак, если вы хотите сохранить, например, список ручек в своем классе, и вы хотите закрыть эти дескрипторы в Finalizer, убедитесь, что этот класс списка НЕ имеет собственный Finalizer, иначе ваши дескрипторы могут исчезнуть раньше вы можете закрыть их!
сборщик мусора довольно умный - вероятно, его обнаружение, что «список» не используется, поэтому он очищает его. –
Я удалил ArrayList. Это не имеет никакого отношения к этому. – Elmue
Включили ли вы оптимизацию? – D3C34C34D