Просмотр полной версии : Flash and memory leaks
Дорогие друзья. Кто занимался этой проблемой (сабж), плиз, поделитесь - какие нашли места утечки, вне зависимости - ваш это был неочевидный косяк или текут встроенные классы.
Ужасно много времени занимает эта проблема. А сумашедший garbage collector поднимает сложность анализа крупного прилодения до дьявольских высот.
Для упрощения взаимопонимания. Выключил 90% аппликухи, осталось несколько классов. ASProfiler показывает, что нет никаких периодических вызовов. Однако мемори ликс - есть.
Давайте делиться опытом!
Ну что же. Три дня мучений и пару штук я нашел.
Про netConnection наверное все знают? Ну кто не знает:var a:NetConnection = ...;
a.connect(...);
a.call('...', a); a.onResult = function(infoObj:Object) {}; Вот эта конструкция при большом количестве вызовов a.call('...', a); здорово жрет память и проц. Решение - просто скидывать NetConnection и генерить новый.
Но это простой баг, я его давно нашел. А самый крутой - вот:
Вот эта конструкция не дает утечек памятиsetInterval(function() { var c = 0; if(c) { var a = 1; } else { z = 2; } }, 30);А вот эта - дает!
setInterval(function() { if(0) { var a = 1; } else { z = 2; } }, 30);И причем дает дохрена.
Аналогичным образом, эта конструкция тоже течет _root.ff = function() { };
setInterval(function() { _root.ff(); }, 30);ну и эта тоже... понятно.
setInterval(function() { function() { }, 30);
Чтобы победить утечки в этих конструкциях, нужно, чтобы в периодически вызываемой функции обязательно происходили хоть какие-нибудь вычисления. Хотя бы и после return (!!!). Например:mc.onEnterFrame = function(){return;};будет течь, а mc.onEnterFrame = function(){return; _root.aabbcc = 1; }; не будет! (вот пипец)
Дальше - не менее круто. Периодические функции, вызываемые через Delegate.create будут течь в любом случае!! Привет всем любителям делегирования от компании macromedia.
Также обнаружил что обращение к MovClip.filters внутри периодически вызываемой функции тоже течет.
Мои муки с memory leaks в самом разгаре, вполне возможно что список дополнится -)
†‡Paladin‡†
08.06.2007, 14:39
Круто. Буду знать.
alexcon314
08.06.2007, 16:54
Действительно, круто! Без шуток. Но до конца я не понимаю, в связи с чем такое море проблем возникло. Ты решил провести своего рода "глобальный тест" на утечки что ли?
Или это все было в одном приложении, которое вызывало memory leaks?
Я пишу desktop application, если не убирать такого рода утечки, аппликуха отжирает за ночь 300 метров и виснет.
кстати, я нашел пример когда Delegate.create не течет.. но пока мне могу разобраться почему -) Слишком большая аппликуха.
UPD: 2alexcon314: Кстати, я знаю ты пользуешся цинком? Я кое что тестировал на цинке, и ни один из сэмплов не тек -)) Умный цинк ловит утечки флеш плеера! Но я, к сож, не могу пользоваться цинком.
alexcon314
08.06.2007, 20:02
Мм-дааа... тут действительно задумаешься. Я не замечал в цинке таких проколов, но теперь буду внимательнее. У меня после беглого теста возникло предположение, что lekas начинается если идут переходы по кадрам. В одном кадре с этими примерами ничего необыкновенного не происходит. И в цинке - leak происходит непонятными рывками и проц на грани падения. Когда в одном кадре - все спокойно.
не пытал только Net.connection. И не оставлял на ночь. У меня сразу все начинается, если начинается вообще.
А ты как тестишь?
Короче.
1. Последние исследования показали что флеш плеер течет, и будет течь неостановимо (АС2! АС3 почти не течет). Так что все, кто занимается этой проблемой - забейте.
2. Zinc - подбирает память за ФП, так что Zinc - решение для АС2 юзеров. Для меня - проблема в том что Zinc адски тормозит в транспарент моде.
3. Для писателей АС2-аппликух для работы в браузере - убойтесь ФП. И переходите на АС3.
Дорогие друзья. Хочу принести извинения за некорректные сведения.
Еще несколько (сотен) тестов совершенно изменили картину. Не вдаваясь в подробности: новые результаты:
1. Единственный проверенный источник утечек, из тех, что я упоминал - net_connection_instance.onResult(..);
2. Флюктуации с памятью при работе со всеми остальными приведенными примерами исправляются garbage collector'ом ФП. Через некоторое время, при суммарных утечках не менее ~2МБ (вот и причина моих преждевременных выводов, - я не дожидался этого момента).
3. MDM Zinc не стал течь на каких тестах, из тех что я ему давал. Впрочем, я нисколько не уверен что и он не имеет своих дыр.
PS. Господа модеры. Возможно, во избежание смущения, умов этот тред надо удалить?
var str:String = "";
try
{
for (var i:int = 0; i < list.length; i++)
{
str += "<font color='#521017'>[" + list[i].Level + "]</span> <a href='event:" + list[i].Username + "'>" +
list[i].UsernameHtml(true) +"</a>" + " (<b><a href='" + m_hostName +
list[i].PlayerLink + "' class='style2' target='_blank'>i</a></b>)" + "<br>";
}
}
catch(_e:Error)
{
}
m_comp.TextfieldUsersList.htmlText = str;
m_comp.ScrollBar2.update();
m_comp.ScrollBar2.scrollPosition = m_chat_s.ScrollBar2.scrollPosition;
str = null;
Если оставить try catch, то утечка
если закомментировать try catch то нет утечки.
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.