Информационный сайт

 

Реклама
bulletinsite.net -> Книги на сайте -> Программисту -> Троелсен Э. -> "С# и платформа .NET. Библиотека программиста" -> 84

С# и платформа .NET. Библиотека программиста - Троелсен Э.

Троелсен Э. С# и платформа .NET. Библиотека программиста — СПб.: Питер, 2004. — 796 c.
ISBN 5-318-00750-3
Скачать (прямая ссылка): cplatforma2004.pdf
Предыдущая << 1 .. 78 79 80 81 82 83 < 84 > 85 86 87 88 89 90 .. 320 >> Следующая

GC. GetTota 1 Memory (fa1se).ToSt ri ng O);
Il Разнецаеи объекты класса Саг в управляемой куче Саг Cl, с2. сЗ, с4;
el = new CarC'Carone". 40. 10); с2 - newCarCtartwo", 70. 5): сЗ - new Cart "Car three". 200. 100); c4 = new CarC'Car four", 140. 80):
// ;- метод DispossO к некоторым с&йкг-я- В результате завершение
// для них будет отиенено Cl. Dispose О; c3.Dispose();
// Вызываем метод Finanzen для объектов, остающихся в очереди
// завершений
GC.CollectO;
return 0;
}
}
Оптимизация сборки мусора
При знакомстве с членами класса System. GC мы уже встречались с понятием жжс ления. Поколение (generation) — это еще одна концепция, имеющая назначение сделать процесс сборки мусора в .NET более удобным.
Когда сборщик мусора .NET помечает объекты для завершения, обычно он не проверяет все подряд объекты приложения: это заняло бы слишком много времени, особенно для больших (то есть реальных) приложений. Для того чтобы повысить производительность сборки мусора, все объекты в управляемой куче разбиты на группы — поколения. Смысл такой группировки прост: чем дольше объект существует в управляемой куче, тем больше вероятность того, что он будет нужен и в дальнейшем. В качестве примера можно привести объект самого приложения — он появляется при запуске приложения и удаляется лишь при ,завершении его работы. В то же время существует значительная вероятность того, что недавно появившиеся объекты быстро перестанут быть нужными (например, временные объекты, определенные внутри области видимости метода). Основываясь на этой концепции, каждый объект относится к одному из следующих поколений:
• Поколение 0: недавно появившиеся объекты, которые еще не проверялись сборщиком мусора.
194 Глава 3 • С# и объектно-ориентированное программирование
• Поколение 1: объекты, которые пережили одну проверку сборщика мусора (они были помечены для удаления, но не удалены физически, поскольку
в управляемой куче было достаточно свободного места).
• Поколение 2: объекты, которые пережили более чем одну проверку сборщика мусора.
При очередном запуске процесса сборки мусора сборщик в первую очередь производит проверку и удаление всех объектов поколения 0. Если при этом освободилось достаточно места, выжившие объекты поколения 0 переводятся в поколение 1 и на этом процесс сборки мусора заканчивается. Если же после проверки поколения 0 места все еще недостаточно, запускается процесс проверки объектов поколения 1, а затем (при необходимости) — и поколения 2. Таким образом, за счет концепции поколений недавно созданные объекты обычно удаляются быстрее, чем
объекты «с историей».
Мы вполне можем определять, к какому поколению относится тот или иной объект, непосредственно в процессе выполнения программы. Для этого исполь-зуетсд метод GC. GetGenerat 1 on(). Кроме того, метод GC. Col loot С) позволяет нам указать поколение, которое будет проверяться при вызове сборщика мусора. Код программы, использующей эти возможности, может выглядеть следующим образом:
// Сколько уже прожил наш- объект? public static int Main(string[] args)
і
Con sol е. Wr і tet ine (" Heap memory in use: " + GC.GetTotalMemory(false).ToStringO):
Il Размещаем объекты класса Саг в управляемой куче
Саг Cl. Zl. сЗ. с4;
cl - new Car( "Саг one", 40. 10);
с2 - new CarC'Car two". 70. 5);
сЗ = new Ca г ("Ca r three". 200. 100);
с4 - new CarC'Car four". 140. 80):
Il Выводим информацию о принадлежности объектов к поколениям Console.WriteLineCCl is gen {0}". GCGetGeneration(cl)): Console.WriteLine("C2 is gen {0}". GC.GetGeneration(c2)); Con5ole.WriteLine("C3 is gen {0}", GC,GetGeneration(c3)); Console,WriteLine("C4 is gen {0}". GCGetGeneration(c4));
// Удаляем вручную некоторые объекты
cl.Dispose();
c2.Dispose();
Il Запускаем процесс сборки мусора для объектов поколения 0 GC.ColIeCt(O):
// Вновь информацию о поколения* (все объекты перейдут в следующее
// поколение
Console.WriteLineCCl is gen (0)". GCGetGeneration(cD); Console.WriteLineCC2 is gen {0}". GC.GetGeneration(c2)): Console.Wr1teL1ne("C3 is gen {0}", GCGetGeneratіon(c3)): Console.WriteLinet"C4 is gen (0)". GC.GetGeneration(c4));
//Запускаем процесс сборки мусора для всех поколений
Подведение итогов 195
GC CcllectO; //Вызываем деструкторы для всех объектов, остающихся в куче
Console Ы'-ЧеИпеГНеар memory use: + GC.GelTote;Memory(false).ToString()). return
Результат выполнения этой программы представлен рис. 3.23. Обратите внимание, что после вызова процесса сборки мусора для поколения 0 все объекты перешли в поколение 1 (поскольку они смогли пережить эту проверку).
Существует общее правило: обращаться к сборщику мусора следует только тогда, когда это действительно необходимо. Среда выполнения .NET спроектировала, таким образом, чтобы процесс сборки мусора был полностью автоматизирован и программисту не пришлось задумываться о ручном удалении объектов в коде программы. Необдуманное вмешательство в процесс сборки мусора может привести к снижению производительности приложения. Однако в случае необходимости мы вполне можем определить логику нашего пользовательского деструктора С# или реализовать интерфейс !Disposable для принудительного освобождения ресурсов объектом нашего класса.
Предыдущая << 1 .. 78 79 80 81 82 83 < 84 > 85 86 87 88 89 90 .. 320 >> Следующая
Реклама
Авторские права © 2009 AdsNet. Все права защищены.
Rambler's Top100