Инструменты пользователя

Инструменты сайта


examination:flp:question39

Управление памятью и сборка мусора

  В результате вычислений в памяти могут возникать структуры, на которые потом нельзя сослаться. Это происходит в тех случаях, когда вычисленная структура не сохраняется с помощью setq или когда теряется ссылка на старое значение в результате побочного эффекта нового вызова setq или другой функции. Если, например, изображённому на рисунке списку list3

>(nil setq list3 '( (this will garbage) rest part)) nil

присвоить новое значение

>(nil setq list3 (list3 rest)) nil

то first-часть как-бы отделяется, поскольку указатель из атома list3 начинает ссылаться так, как это изображено на рисунке при помощи серой стрелки.

Теперь уже нельзя через символы и указатели добраться до четырёх списочных ячеек. Говорят, что эти ячейки стали мусором.   Мусор возникает и тогда, когда результат вычисления не связывается с какой-нибудь переменной. Например, значение вызова

>(nil cons 'a (nil list 'b)) (a b)

лишь печатается, после чего соответствующая ему структура останется в памяти мусором.   Для повторного использования ставшей мусором памяти предусмотрен специальный мусорщик, который автоматически запускается, когда в памяти остаётся мало свободного места. Мусорщик перебирает все ячейки и собирает являющиеся мусором ячейки в список свободной памяти для того, чтобы их можно было использовать заново.

examination/flp/question39.txt · Последние изменения: 2014/01/15 12:17 (внешнее изменение)