Добавил:
выбрасываю тут свой мусор, надеюсь, что он кому-то может пригодится... Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
OOP-KONEChNYJ.docx
Скачиваний:
20
Добавлен:
03.12.2023
Размер:
7.72 Mб
Скачать
  1. Освобождение памяти и сборка мусора net–приложений. Стратегия поколений объектов.

Другой важной особенностью среды исполнения .NET Framework является наличие встроенного механизма сборки мусора (Garbage Collector). Этот механизм берет на себя заботы по удалению из памяти тех объектов, которые использовались ранее и в данный момент не нужны. Традиционно, забота по освобождению памяти от ненужных данных ложилась на плечи разработчиков приложений и в некоторых ситуациях несли в себе серьезные трудности. Если разработчик забывал удалить какие-либо ненужные объекты происходила утечка памяти, т.е. складывалась ситуация, когда приложению уже не требуется какой-либо участок памяти в операционной системе, но он остается занятым вплоть до завершения работы приложения.

Реализация поколений в .NET

Согласно модели поколений, динамическая память, обслуживаемая сборщиком мусора, делится на три области: поколение 0, поколение 1 и поколение 2. Эти области соответствуют ожидаемой продолжительности жизни объектов, находящихся в них: поколение 0 включает самые «юные» объекты, а поколение 2 - самые «старые».

Поколение 0

К поколению 0 относятся все вновь созданные объекты (далее в этом разделе будет показано, что объекты также делятся по размеру, что делает это утверждение верным лишь отчасти). Эта область динамической памяти имеет небольшой объем и не может занимать всю динамическую память, даже в небольших приложениях. Обычно для поколения 0 изначально отводится от 256 Кбайт до 4 Мбайт памяти, но этот объем может расти, в зависимости от потребностей.

Когда новый запрос на выделение памяти не может быть удовлетворен из-за переполненности области для поколения 0, инициируется сборка мусора в этой области. В ходе ее выполнения сборщик мусора просматривает только объекты из поколения 0.

Т.е. большинство объектов в поколении 0 будет утилизировано в первом же цикле сборки мусора. 

Объекты из поколения 0, пережившие сборку мусора, не перемещаются в начало области динамической памяти, выделенной для этого поколения, а переносятся в поколение 1, чтобы отразить факт увеличенной продолжительности жизни. В результате этого переноса они копируются из области памяти поколения 0 в область памяти поколения 1:

Поколение 1

Поколение 1 - это буфер между поколением 0 и поколением 2, содержащий объекты, пережившие один цикл сборки мусора. Эта область динамической памяти немного больше области поколения 0, но все еще меньше на несколько порядков объема всей доступной памяти. Обычно для поколения 1 изначально отводится от 512 Кбайт до 4 Мбайт памяти.

Когда область для поколения 1 заполняется, запускается процедура сборки мусора в поколении 1. Это все еще частичная сборка мусора; маркируются и удаляются только объекты из поколения 1. Обратите внимание, что попасть в поколение 1 объект может только из поколения 0, в результате переноса, выполняемого в ходе сборки мусора в поколении 1

Объекты, пережившие цикл сборки мусора в поколении 1, переносятся в поколение 2. Этот перенос отражает тот факт, что теперь объекты будут считаться «старыми». Одним из основных рисков модели поколений является вероятность попадания в поколение 2 временных объектов, которые вскоре после этого должны стать неиспользуемыми; это называется явлением «кризиса среднего возраста».

Поколение 2

Поколение 2 - это последняя область памяти для объектов, переживших как минимум два цикла сборки мусора (а также для очень больших объектов). В модели поколений такие объекты считаются «старыми» и, согласно нашим предположениям, не должны выйти из употребление в ближайшем будущем. Объем памяти для объектов поколения 2 не ограничивается искусственно. Она может занимать все пространство, выделяемое операционной системой процессу, то есть, до 2 Гбайт в 32-разрядной системе и до 8 Гбайт в 64-разрядной.

Несмотря на огромный размер, для поколения 2 определяются пороговые значения, по достижении которых запускается сборка мусора, потому что нет смысла ждать, пока будет заполнена вся память. Если бы все приложения в системе освобождали неиспользуемую память, только после ее заполнения, интенсивное использование файла подкачки сделало бы работу просто невозможной.

Соседние файлы в предмете Объектно-ориентированное программирование