Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Утечка памяти при доступе к Vector (http://www.flasher.ru/forum/showthread.php?t=169741)

Roman_Konyukhov 11.10.2011 12:46

Утечка памяти при доступе к Vector
 
Здравствуйте,

в следующем коде наблюдается утечка памяти:
Код AS3:

 
a = dot[0].x; a = dot[0].y;
a = dot[1].x; a = dot[1].y;
a = dot[2].x; a = dot[2].y;
a = dot[3].x; a = dot[3].y;
a = dot[4].x; a = dot[4].y;

Если этот фрагмент закомментировать, то утечки нет.
этот код выполняется при срабатывании таймера,
a: Number;
dot: Vector.<RDot> = new Vector.<RDot>();
RDot - пользовательский класс без Set и Get методов,

Если для dot поставить тип Array, то утечка такая же.
Как победить?

Добавлено через 38 минут
Ситуация разрешилась следующим изменением кода для каждого индекса:

Код AS3:

t_rdot = dot[0];
a = t_rdot.x; a = t_rdot.y;

Вопрос остается открытым: почему при чтении свойства dot[4].x из массива происходит утечка памяти?
Это такая фишка AS3?

wvxvw 11.10.2011 13:37

Как вы определили утечку? В вашем коде вообще не понятно, являются ли a и dot локальными переменными функции, или полями класса. Существуют ли ссылки на dot помимо этого фрагмента и т.д. Судя по тому, что прозвучало слово "таймер" - таймеры более частая причина проблем связанных с памятью. Их нужно останавливать и отписываться от событий если вы их планируете больше не использовать.

Roman_Konyukhov 11.10.2011 13:49

Это точно не связано с событиями, если проблемный код закомментировать, то утечка пропадает.
dot - поле класса,
a-пробовал и в поле класса размещать и в функции, утечка от этого не зависит.
утечку определил с помощью System.totalMemery.
На элементы массива dot существуют ссылки в других подобных массивах, утечка может быть с этим связана? (хотя механизм утечки мне не понятен)

goodguy 11.10.2011 14:00

Цитата:

утечку определил с помощью System.totalMemery.
И что это за утечка?
Для флеш плеера абсолютно нормально потребление нескольких лишних мегабайт в течении определенного времени. После срабатывания сборщика мусора память освобождается

Roman_Konyukhov 11.10.2011 14:05

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

Inet_PC 11.10.2011 14:37

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

Добавлено через 2 минуты
И почитайте про профайлер и разберитесь, что такое утечка (на википедии есть статья).

Roman_Konyukhov 11.10.2011 14:44

Оказалось, что при периодическом обращении к массиву public var zemy:Vector.<Number> , элементы которого имеют тип Number, происходит постоянное увеличение System.totalMemery.
Разве постоянное увеличение памяти при каждом обращении к элементу массива не является утечкой?
Я так и не понял: возрастание System.totalMemery при каждом чтении элемента любого массива - это нормально?

botbot 11.10.2011 14:45

Полный код лучше увидеть, а так сложно сказать. Тем боле это могут быть просто внутренние механизмы флеша при доступе к вот такому индексу. Например, флеш сначала делает dot[0], получает ссылку на объект и запоминает её для оптимизации - отсюда утечка. Вернее это даже не утечка, а временый перерасход памяти, который потом исчезает или используется повторно. Пытаться оптимизировать скриптовый язык и предсказать его поведение на таком низком уровне задача неблагодарная и малополезная.
Так попробуйте ещё:
Код AS3:

a = (dot[0]).x; a = (dot[0]).y; 
a = (dot[1]).x; a = (dot[1]).y;

Или:
Код AS3:

a = dot[0]['x']; a = dot[0]['y']; 
a = dot[1]['x']; a = dot[1]['y'];


Inet_PC 11.10.2011 14:47

Встроенные типы, такие как Number, не передаются по ссылке, по этому флешплеер при обращении создает новую копию каждый раз, вот отсюда (возможно) и увеличение totalMemory.

wvxvw 11.10.2011 22:45

Чтобы доказать, что существует утечка вам нужно получить ошибку #1000 - out of memory. Иначе это все досужие домыслы. В вашем коде нет никаких очевидных признаков, более того, никаких даже более менее понятных признаков того, что именно происходит (вам бы нужно было продемонстривоать как массив / вектор создается, как заполняется, кто к нему осуществляет доступ, и когда объекты из вектора / массива больше не имеют внешних ссылок.

etc 11.10.2011 22:51

Эти строчки без контекста никакой информации не дают.

dimarik 11.10.2011 23:45

Напомнило про Лики памяти [x]


Часовой пояс GMT +4, время: 18:51.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.