ГлавнаяActionScript 3 — «100 советов» › Сборщик мусора (Garbage Collection)

Сборщик мусора (Garbage Collection)

June 19th, 2006
Сборщик мусора (Garbage Collection – GC) автоматический процесс во Flash-плеере, который удаляет данные из памяти, когда они более не нужны. GC оценивает необходимость удаления по двум критериям: счетчик ссылок (reference counting) и очистка по меткам (mark and sweep)

1. Счетчик ссылок – это процесс, который следит за количеством переменных, ссылающихся на объекты в памяти.

Код:
var a:Object = new Object(); //создается новый объект и новая переменная "a", которая ссылается на этот объект, счетчик ссылок = 1 var b:Object = a; // еще одна ссылка на тот же объект, счетчик ссылок = 2

Когда не останется ни одной ссылки на объект, то он будет удален из памяти.

Код:
a=null; // счетчик ссылок стал равен 1 b=null; // счетчик ссылок стал равен 0, и объект будет удален из памяти

Есть случаи, когда счетчик ссылок не сработает, например:

Код:
var a:Object = new Object(); // счетчик ссылок на первый объект = 1 var b:Object = new Object(); // счетчик ссылок на второй объект = 1 a.b = b; // счетчик ссылок на второй объект = 2 b.a = a; // счетчик ссылок на первый объект = 2 a=null; // счетчик ссылок на первый объект = 1 b=null; // счетчик ссылок на второй объект = 1

Обе переменные “a” и “b” более не ссылаются на объекты, но первый объект доступен из второго и второй доступен из первого. В данном случае счетчик ссылок не сработает, пора приниматься за дело процессу очистке по меткам.

2. Очистка по меткам – это процесс, который сканирует все объекты от базового класса (root или stage) и помечает каждого, кого нашел. Все не найденные объекты недоступны и потому будут удалены. Из предыдущего примера про “a” и “b”, поскольку “a” и “b” более недоступны из root они не будут помечены и будут удалены.

Код:
[root] <- сканирование... [objectRef (помечен)] <- сканирование... [objectRef (помечен)] <- сканирование... [objectRef (помечен)] <- сканирование... [objectRef (помечен)] <- сканирование... [objectRef (помечен)] <- сканирование... ... [удалить все непомеченное]

Очистка по меткам очень ресурсоемкий процесс, поэтому выполняется редко, решение о том, когда запустить процессы удаления данных из памяти принимает flash-плеер сам, и программно инициировать эти процессы мы не можем.

MerlinTwi: Хочу обратить ваше внимание на то, что добавление обработчиков событий к объекту (или setInterval) не позволит сборщику мусора (GC) удалить этот объект, т.к. на него остаются ссылки из процессов рассылающих события. Например:

Код:
init(); function init():void { var test:Sprite = new Sprite(); test.addEventListener(Event.ENTER_FRAME, handle); } function handle(e:Event):void { trace("enterFrame"); }

Локальная переменная test, ссылающаяся на созданный спрайт удалена, сам спрайт недоступен из root или stage, но он не будет удален из памяти т.к. спрайт слушает событие enterFrame, и функция handle будет продолжать срабатывать. Для того чтобы объект был удален, нужно освобождать слушаемые им события, когда они более не нужны:

Код:
test.removeEventListener(Event.ENTER_FRAME, handle);

Категория: ActionScript 3 — «100 советов» Ярлыки: ,

Смотрите также

Преобразование Number() больше не поддерживает восьмеричную систему Мягкие ссылки
  1. Пока без комментариев.
  1. Пока нету.