Вход/Регистрация
ЯЗЫК ПРОГРАММИРОВАНИЯ С# 2005 И ПЛАТФОРМА .NET 2.0. 3-е издание
вернуться

Троелсен Эндрю

Шрифт:

 Console.WriteLine("Число генераций для данной OC: {0}\n", (GC.МахGeneration + 1));

 Car refToMyCar = new Car("Zippy", 100);

 Console.WriteLine(refToMyCar.ToString);

 // Вывод информации о генерации для объекта refToMyCar.

 Console.WriteLine("Генерация refToMyCar: {0}", GC.SetGeneration(refToMyCar));

 Console.ReadLine;

}

Активизация сборки мусора

Итак, сборщик мусора в .NET призван управлять памятью за вас. Однако в очень редких случаях, перечисленных ниже, бывает выгодно программно активизировать начало сборки мусора, используя дня этого GC.Collect.

• Перед входом приложения в блок программного кода, для которого нежелательно, чтобы его выполнение прерывалось возможной сборкой мусора.

• После окончания размещения очень большого числа объектов, когда вы желаете освободить как можно больше памяти.

Если вы сочтете, что будет выгодно выполнить сборку мусора, вы можете явно начать процесс сборки мусора так, как показано ниже.

static void Main(string[] args) {

 …

 // Активизация сборки мусора и

 // ожидание завершения финализации объектов.

 GC.Collect;

 GC.WaitForPendingFinalizers;

 …

}

При непосредственной активизации сборки мусора вы должны вызвать GC.WaitForPendingFinalizers. В рамках этого подхода вы можете быть уверены, что все лредуcматривающие финализацию объекты обязательно получат возможность выполнить все необходимые завершающие действия, прежде чем ваша программа продолжит свою работу. "За кулисами" GC.WaitForPendingFinalizers приостановит выполнение вызывающего "потока" на время процесса сборки мусора. Это гарантирует, что ваш программный код не сможет вызвать метод объекта, уничтожаемого в данный момент.

Методу GC.Collect можно передать числовое значение, указывающее старейшую генерацию, для которой должна быть выполнена сборка мусора. Например, если вы желаете сообщить CLR, что следует рассмотреть только объекты генерации 0, вы должны напечатать следующее.

static void Main(string[] args) {

 …

 // Рассмотреть только объекты генерации 0.

 GC.Collect(0);

 GC.WaitForPendingFinalizers;

 …

}

Подобно любой сборке мусора, вызов GC.Collect повысит статус выживших генераций. Предположим, например, что наш метод Main обновлен так, как показано ниже.

static void Main(string[] args) {

 Console.WriteLine ("***** Забавы с System.GC *****\n");

 // Вывод информации об объеме динамической памяти.

 Console.WriteLine("Оценка объёма памяти (в байтах): {0}", GC.GetTotalMemory(false));

 // Отсчет для MaxGeneration начинается с нуля.

 Console.WriteLine("Число генераций для данной ОС: {0}\n", (GC.MaxGeneration + 1));

 Car refToMyCar = new Car("Zippy", 100);

 Console.WriteLine(refToMyCar.ToString);

 // Вывод информации о генерации для объекта refToMyCar.

 Console.WriteLine("\nГенерация refToMyCar: {0}", GC.GetGeneration(refToMyCar));

 // Создание тысяч объектов с целью тестирования.

 object[] tonsOfObjects = new object[50000];

 for (int i = 0; i ‹ 50000; i++) tonsOfObjects [i] = new object;

 // Сборка мусора только для объектов генерации 0.

 GC.Collect(0);

 GC.WaitForPendingFinalizers;

 // Вывод информации о генерации для объекта refToMyCar.

 Console.WriteLine("Генерация refToMyCar: {0}", GC.GetGeneration(refToMyCar));

 // Проверим, "жив" ли объект tonsOfObjects[9000].

 if (tonsOfObjects[9000] != null) {

Console.WriteLine("Генерация tonsOfObjects[9000]: {0}", GC.GetGeneration(tonsOfObjects[9000]));

 } else Console.WriteLine("Объекта tonsOfObjects[9000] ужe нет");

 // Вывод числа процедур сборки мусора для генераций.

  • Читать дальше
  • 1
  • ...
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: