Форум Flasher.ru

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

Lascc 08.11.2010 20:53

Утечка памяти
 
Здравствуйте, подскажите что я делаю не правильно. Класс обращается за данными каждые 10 секунд. При какдом запросе приложение все больше и больше памяти "съедает" (смотрю через flash.system.System totalMemory). Как грамотно освободиться от утечки?
Код AS3:

public class NameClass
        {
                private var variables:URLVariables;
                private var urlRequest:URLRequest;
                private var loader:URLLoader;
 
                private var timer:Timer  = new Timer(10000, 0);
 
                private var error:String;
 
                public function NameClass()
                {
                        timer.addEventListener(TimerEvent.TIMER, request);
                        timer.start();
                }
 
                public function stop():void {
                        timer.stop();
                }
                public function start():void {
                        timer.start();
                }
 
                public function get error1():String {
                        return error;
                }
                private function request(e:TimerEvent):void {
                        variables = new URLVariables();
                        variables.md5 = MD5.hash("SomeString");
                                  variables.data = "data";
 
                        urlRequest = new URLRequest("http://192.168.10.50/test.php");
                        urlRequest.data = variables;
                        urlRequest.method = URLRequestMethod.POST
 
                        loader = new URLLoader();
 
                        loader.addEventListener(Event.COMPLETE, update);
                        loader.addEventListener(IOErrorEvent.IO_ERROR, io_error);
 
                        try {
                                loader.load(urlRequest);
                        }
                        catch (error:Error) {
                                loader.removeEventListener(Event.COMPLETE, update);
                                loader.removeEventListener(IOErrorEvent.IO_ERROR, io_error);
                        }
                }
 
                private function update(e:Event):void {
                        loader.removeEventListener(Event.COMPLETE, update);
                        loader.removeEventListener(IOErrorEvent.IO_ERROR, io_error);
                        //Обработка
                }
 
                private function io_error(e:IOErrorEvent):void {
                        e.currentTarget.removeEventListener(Event.COMPLETE, update);
                        e.currentTarget.removeEventListener(IOErrorEvent.IO_ERROR, io_error);
                        error = "Ошибка I/O";
                        this.stop();               
                }
        }


expl 08.11.2010 23:50

Попробуйте после завершения каждой загрузки и отписки от слушателей вызывать
Код AS3:

System.gc();//Работает только в дебажной версии флешплеера

1. Если память перестала расти - значит утечки нет - просто GC не торопиться ее чистить, т.к. её хватает.
Варианты действий:
- забить, если не вызвает проблем - когда память потребуется или еще какие условия свершатся - все будет очищено;
- не создавать работы для GC - сделать пул создаваемых объектов.

2. Если память расти не перестала - ищем дальше :)

При поверхностном обзоре кода - не нашел более одного объекта, способного одновременно застрять в памяти.

Еще не ясно, что происходит в "//Обработка" - может там загруженный объект застревает где-то в глубине приложения.

Lascc 09.11.2010 10:56

После System.gc(); память перестала расти. Пожете подсказать на счет:
Цитата:

не создавать работы для GC - сделать пул создаваемых объектов.
Как это сделать? Где посмотреть примеры кода?

random13 09.11.2010 11:54

Цитата:

Сообщение от Lascc (Сообщение 948484)
После System.gc(); память перестала расти. Пожете подсказать на счет:

Как это сделать? Где посмотреть примеры кода?

http://ru.wikipedia.org/wiki/%D0%9E%...BF%D1%83%D0%BB

тут объяснение

Lascc 09.11.2010 12:04

random13, Спасибо, но это я и сам нашел. Хотелось бы пример на AS3.

leofit 09.11.2010 12:12

Если Вы уверены, что запрос длится менее 10 сек, что Вам мешает эти строки вынести в конструктор и создавать только один раз?
Код AS3:

                        variables = new URLVariables();
                        variables.md5 = MD5.hash("SomeString");
                                  variables.data = "data";
 
                        urlRequest = new URLRequest("http://192.168.10.50/test.php");
                        urlRequest.data = variables;
                        urlRequest.method = URLRequestMethod.POST
 
                        loader = new URLLoader();

Даже вот так если по хорошему

Код AS3:

 
public class NameClass
        {
                private var variables:URLVariables;
                private var urlRequest:URLRequest;
                private var loader:URLLoader;
 
                private var timer:Timer  = new Timer(10000, 0);
 
                private var error:String;
 
                public function NameClass()
                {
 
                        variables = new URLVariables();
                        variables.md5 = MD5.hash("SomeString");
                        variables.data = "data";
 
                        urlRequest = new URLRequest("http://192.168.10.50/test.php");
                        urlRequest.data = variables;
                        urlRequest.method = URLRequestMethod.POST
 
                        loader = new URLLoader();
 
                        loader.addEventListener(Event.COMPLETE, update);
                        loader.addEventListener(IOErrorEvent.IO_ERROR, io_error);
 
                        timer.addEventListener(TimerEvent.TIMER, request);
                        timer.start();
 
                }
 
                public function stop():void {
                        timer.stop();
                }
                public function start():void {
                        timer.start();
                }
 
                public function get error1():String {
                        return error;
                }
                private function request(e:TimerEvent):void {
 
 
                        try {
                                loader.load(urlRequest);
                        }
                        catch (error:Error) {
                                //loader.removeEventListener(Event.COMPLETE, update);
                                //loader.removeEventListener(IOErrorEvent.IO_ERROR, io_error);
                        }
                }
 
                private function update(e:Event):void {
                        //loader.removeEventListener(Event.COMPLETE, update);
                        //loader.removeEventListener(IOErrorEvent.IO_ERROR, io_error);
                        //Обработка
                }
 
                private function io_error(e:IOErrorEvent):void {
                        //e.currentTarget.removeEventListener(Event.COMPLETE, update);
                        //e.currentTarget.removeEventListener(IOErrorEvent.IO_ERROR, io_error);
                        error = "Ошибка I/O";
                        this.stop();               
                }
        }


Obi 09.11.2010 12:16

Попробуйте на всякий случай использовать useWeakReference = true

P.S.: Не помню точно, но по-моему не должно возникнуть никаких проблем с использованием объекта loader повторно, без создания нового экземпляра.

random13 09.11.2010 13:43

Цитата:

Сообщение от Obi (Сообщение 948502)
Попробуйте на всякий случай использовать useWeakReference = true

P.S.: Не помню точно, но по-моему не должно возникнуть никаких проблем с использованием объекта loader повторно, без создания нового экземпляра.

не лучшая практика

Psycho Tiger 09.11.2010 13:48

Цитата:

Сообщение от random13 (Сообщение 948519)
не лучшая практика

Почему?

random13 09.11.2010 16:42

Цитата:

Сообщение от Psycho Tiger (Сообщение 948523)
Почему?

а что хорошего в слабых ссылках, на сколько я знаю лучше все предварительно подчистить за собой чтоб объект удалился


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

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