При запуске сборки мусора вручную всегда должен вызываться метод GC.WaitForPendingFinalizers()
GC.WaitForPendingFinalizers() приостановит вызывающий поток на время прохождения сборки мусора. Это очень хорошо, т.к. гарантирует невозможность обращения в коде к методам объекта, который в текущий момент уничтожается.Методу GC.Collect()
...
// Исследовать только объекты поколения 0.
GC.Collect(0);
GC.WaitForPendingFinalizers();
...
Кроме того, методу Collect()
GCCollectionMode для точной настройки способа, которым исполняющая среда должна принудительно инициировать сборку мусора. Ниже показаны значения, определенные этим перечислением:public enum GCCollectionMode
{
Default, // Текущим стандартным значением является Forced.
Forced, // Указывает исполняющей среде начать сборку мусора немедленно
Optimized // Позволяет исполняющей среде выяснить, оптимален
// ли текущий момент для удаления объектов.
}
Как и при любой сборке мусора, в результате вызова GC.Collect()
Console.WriteLine("***** Fun with System.GC *****");
// Вывести оценочное количество байтов, выделенных в куче.
Console.WriteLine("Estimated bytes on heap: {0}",
GC.GetTotalMemory(false));
// Значения MaxGeneration начинаются c 0.
Console.WriteLine("This OS has {0} object generations.\n",
(GC.MaxGeneration + 1));
Car refToMyCar = new Car("Zippy", 100);
Console.WriteLine(refToMyCar.ToString());
// Вывести поколение refToMyCar.
Console.WriteLine("\nGeneration of refToMyCar is: {0}",
GC.GetGeneration(refToMyCar));
// Создать большое количество объектов для целей тестирования.
object[] tonsOfObjects = new object[50000];
for (int i = 0; i < 50000; i++)
{
tonsOfObjects[i] = new object();
}
// Выполнить сборку мусора только для объектов поколения 0.
Console.WriteLine("Force Garbage Collection");
GC.Collect(0, GCCollectionMode.Forced);
GC.WaitForPendingFinalizers();
// Вывести поколение refToMyCar.
Console.WriteLine("Generation of refToMyCar is: {0}",
GC.GetGeneration(refToMyCar));
// Посмотреть, существует ли еще tonsOfObjects[9000].
if (tonsOfObjects[9000] != null)
{
Console.WriteLine("Generation of tonsOfObjects[9000] is: {0}",
GC.GetGeneration(tonsOfObjects[9000]));
}
else
{
Console.WriteLine("tonsOfObjects[9000] is no longer alive.");
// tonsOfObjects[9000] больше не существует
}
// Вывести количество проведенных сборок мусора для разных поколений.
Console.WriteLine("\nGen 0 has been swept {0} times",
GC.CollectionCount(0)); // Количество сборок для поколения 0