![]() |
Утечка памяти при доступе к Vector
Здравствуйте,
в следующем коде наблюдается утечка памяти: Код AS3:
этот код выполняется при срабатывании таймера, a: Number; dot: Vector.<RDot> = new Vector.<RDot>(); RDot - пользовательский класс без Set и Get методов, Если для dot поставить тип Array, то утечка такая же. Как победить? Добавлено через 38 минут Ситуация разрешилась следующим изменением кода для каждого индекса: Код AS3:
Это такая фишка AS3? |
Как вы определили утечку? В вашем коде вообще не понятно, являются ли a и dot локальными переменными функции, или полями класса. Существуют ли ссылки на dot помимо этого фрагмента и т.д. Судя по тому, что прозвучало слово "таймер" - таймеры более частая причина проблем связанных с памятью. Их нужно останавливать и отписываться от событий если вы их планируете больше не использовать.
|
Это точно не связано с событиями, если проблемный код закомментировать, то утечка пропадает.
dot - поле класса, a-пробовал и в поле класса размещать и в функции, утечка от этого не зависит. утечку определил с помощью System.totalMemery. На элементы массива dot существуют ссылки в других подобных массивах, утечка может быть с этим связана? (хотя механизм утечки мне не понятен) |
Цитата:
Для флеш плеера абсолютно нормально потребление нескольких лишних мегабайт в течении определенного времени. После срабатывания сборщика мусора память освобождается |
Я не считаю это нормальным, и в официальном руководстве от Adobe рекомендуется избегать утечек. Пока ситуация разрешилась. Но хотелось бы понять природу этой утечки.
|
Вот именно утечек, а не того, что Вы называете этим словом. Сборщик мусора запускается когда ему заблагорассудится, а не после каждой строчки в Вашем коде.
Добавлено через 2 минуты И почитайте про профайлер и разберитесь, что такое утечка (на википедии есть статья). |
Оказалось, что при периодическом обращении к массиву public var zemy:Vector.<Number> , элементы которого имеют тип Number, происходит постоянное увеличение System.totalMemery.
Разве постоянное увеличение памяти при каждом обращении к элементу массива не является утечкой? Я так и не понял: возрастание System.totalMemery при каждом чтении элемента любого массива - это нормально? |
Полный код лучше увидеть, а так сложно сказать. Тем боле это могут быть просто внутренние механизмы флеша при доступе к вот такому индексу. Например, флеш сначала делает dot[0], получает ссылку на объект и запоминает её для оптимизации - отсюда утечка. Вернее это даже не утечка, а временый перерасход памяти, который потом исчезает или используется повторно. Пытаться оптимизировать скриптовый язык и предсказать его поведение на таком низком уровне задача неблагодарная и малополезная.
Так попробуйте ещё: Код AS3:
Код AS3:
|
Встроенные типы, такие как Number, не передаются по ссылке, по этому флешплеер при обращении создает новую копию каждый раз, вот отсюда (возможно) и увеличение totalMemory.
|
Чтобы доказать, что существует утечка вам нужно получить ошибку #1000 - out of memory. Иначе это все досужие домыслы. В вашем коде нет никаких очевидных признаков, более того, никаких даже более менее понятных признаков того, что именно происходит (вам бы нужно было продемонстривоать как массив / вектор создается, как заполняется, кто к нему осуществляет доступ, и когда объекты из вектора / массива больше не имеют внешних ссылок.
|
Эти строчки без контекста никакой информации не дают.
|
Напомнило про Лики памяти [x]
|
| Часовой пояс GMT +4, время: 18:51. |
Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.