GC.GetGeneration(refToMyCar));
Console.ReadLine;
Вы должны получить примерно такой вывод:
***** Fun with System.GC *****
Estimated bytes on heap: 75760
This OS has 3 object generations.
Zippy is going 100 MPH
Generation of refToMyCar is: 0
Методы из табл. 9.2 более подробно обсуждаются в следующем разделе.
Принудительный запуск сборщика мусора
Не забывайте о том, что основное предназначение сборщика мусора связано с управлением памятью вместо программистов. Однако в ряде редких обстоятельств сборщик мусора полезно запускать принудительно, используя метод GC.Collect
• приложение входит в блок кода, который не должен быть прерван вероятной сборкой мусора;
• приложение только что закончило размещение исключительно большого количества объектов, и вы хотите насколько возможно скоро освободить крупный объем выделенной памяти.
Если вы посчитаете, что принудительная проверка сборщиком мусора наличия недостижимых объектов может принести пользу, тогда можете явно инициировать процесс сборки мусора:
...
// Принудительно запустить сборку мусора
// и ожидать финализации каждого объекта.
GC.Collect;
GC.WaitForPendingFinalizers;
...
При запуске сборки мусора вручную всегда должен вызываться метод 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;
}
Бьёрн Страуструп , Ирина Сергеевна Козлова , Бьерн Страуструп , Валерий Федорович Альмухаметов
Программирование, программы, базы данных / Базы данных / Программирование / Учебная и научная литература / Образование и наука / Книги по IT