Алгоритм сборки мусора  

Алгоритм сборки мусора

Если новый объект требует для размещения больше памяти, чем имеющийся свободный объем, CLR запускает процесс, называемый сборка мусора[5] (garbage collection). На первом этапе сборки мусора строится граф используемых объектов. Отправными точками в построении графа являются корневые объекты. Это объекты следующих категорий:

– локальная переменная или аргумент выполняемого метода (а также всех методов в стеке вызова);

– статическое поле;

– объект в очереди завершения (этот термин будет разъяснён позже).

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

Рис. 2. Различные фазы алгоритма сборки мусора.

При размещении и удалении объектов CLR использует ряд оптимизаций. Во-первых, объекты размером более 85000 байтов размещаются в отдельной управляемой куче больших объектов (Large Object Heap). При сборке мусора данная куча не дефрагментируется, так как копирование больших блоков памяти снижает производительность. Во-вторых, управляемая куча для малых объектов выделяет три поколения объектов – Gen0, Gen1 и Gen2. Вначале все объекты в куче относятся к Gen0. После первой сборки мусора те объекты, которые не были удалены, переходят в поколение Gen1, а новые объекты будут принадлежать Gen0. Вторая сборка мусора порождает поколение Gen2. Процесс сборки мусора работает с объектами старших поколений, только если освобождение памяти в младших поколениях дало неудовлетворительный результат.

Сборщик мусора представлен статическим классом System.GC, который обладает несколькими полезными методами (приведён неполный список):

1. Collect() – вызывает принудительную сборку мусора в программе.

2. GetGeneration() – возвращает номер поколения для указанного объекта;

3. SuppressFinalize() – подавляет вызов финализатора для объекта;

4. WaitForPendingFinalizers() – приостанавливает текущий поток выполнения до тех пор, пока не будут выполнены все финализаторы освобождаемых объектов.


8768810553627884.html
8768872512130225.html

8768810553627884.html
8768872512130225.html
    PR.RU™