Накопление мусора

Фрагментация

 

Если блоки переменной длины выделяются или освобождаются в произвольном порядке, то список свободных блоков может стать очень длинным, особенно если блоки при освобождении не укрупняются. Это приводит к ситуации, когда в ответ на очередной запрос о выделении памяти размера size байт в куче не окажется непрерывного свободного участка требуемого размера, т.е. MaxAvail < size, в то время как суммарный объем свободной памяти достаточен для выполнения запроса, т.е. MemAvail >= size. Разбиение всей доступной памяти области кучи на большое количество блоков относительно малого размера называется внешней фрагментацией.

Внутренняя фрагментация связана с появлением неиспользуемых, но и недоступных участков памяти. Внутренняя фрагментация порождается, в частности, механизмом формирования списка свободных блоков. Так, если запрашиваемый размер памяти не кратен восьми байтам, в куче образуется “дырка” размером 1-7 байт, причем этот участок не может использоваться ни при каком другом запросе динамической памяти до того момента, когда связанный с ним объект не будет удален из кучи. Внутренняя фрагментация может возникнуть также вследствие реализации алгоритма резервирования блоков, имеющих размер, больший запрошенного (т.е. за счет отказа от деления блока на части, одна из которых может оказаться совсем маленькой). Внутреннюю фрагментацию могут вызвать сами пользователи, резервируя память “про запас”, заведомо большего размера, чем может понадобиться в текущий момент выполнения программы. Внутренняя фрагментация приводит к ситуации, когда на некоторый запрос будет получен отказ из-за отсутствия блоков требуемого размера, хотя зарезервированной, но не используемой памяти более чем достаточно для удовлетворения запроса, т.е. MaxAvail < size, MemAvail < size, где size – размер запроса.

 

 

Мусором называются блоки памяти, доступ к которым во время выполнения программы оказался потерян, так что эти блоки больше не используются, но и не могут быть возвращены в кучу. Возникновение мусора иллюстрирует программный фрагмент и рис. 48.

. . .

var p,q: PList;

begin

new (p); new (q);

p:=q; . . .

end;