GC тоже иногда расслабляется
Создаем текстуру для Stage3D. Добавляем ее как ссылку в некий TestObject extends Object. Повторяем создание новой текстуры и объекта невообразимое количество раз. Ссылку на каждый новый TestObject не запоминаем из принципа. GC отлично срабатывает, и мы не получаем уведомления от рантайма о переполнении GPU memory. Теперь перепишем листинг класса TestObject так, чтобы он создавал в себе ссылку на метод, созданный в его контексте (метод объекта, анонимка). Запускаем.
AIR 3.5, 3.7
UPD. Такое поведение GC связано с наличием циклических ссылок. Можно просто создать в объекте ссылку на самого себя, не обязательно ссылку на себя через свой метод. Предположительно, к удалению подобных "зацикленных" объектов GC приступает в некотором будущем, соотносящимся с заполнением оперативной памяти. Однако за это время может произойти переполнение видеопамяти, т.к. объем RAM обычно существенно превышает объем VRAM, доступный для Flash/AIR рантайма.
Как бороться? Почувствовать себя в роли GC и принудительно очищать видеопамять, совершая обряд TextureBase#dispose(). В AIR можно время от времени запускать System.gc(); Но очень гаденько становится от одной только мысли, что в GC-системе программист должен заботиться о сборке мусора.
Пример объекта с простейшей циклической ссылкой
Всего комментариев 4
Комментарии
11.06.2013 13:43 | |
замыкание метода хранит в себе ссылку на хозяина, то есть ссылка на метод (для GC) равносильна ссылке на объект
|
11.06.2013 18:53 | |
Анонимки всегда радовали.
|
04.07.2013 19:00 | |
но ведь переполнения ГПУ будет в любом случае если не диспозить текстуру
|
01.08.2013 18:45 | |
Обновил запись
|
Последние записи от dimarik
- Memory allocation на Vector.<IInterface> (07.05.2015)
- [Starling] Тормози меня плавно! (28.10.2014)
- [Starling идиотизмы] Об интерактивных событиях (02.10.2014)
- О типах исключений. (23.04.2014)
- Немного о Vector и ByteArray (28.03.2014)