2013-02-24 4 views
0

Когда массив массивных массивов обрабатывается большим количеством данных, например, 2 000 000 новых объектов, на которые ссылаются, память в браузере клиента flex увеличивается до 20 МБ. Этот избыток 20 МБ не зависит от переменных, определенных в объекте. Ниже приведен подробный пример.Flex, потребляющий огромную память для больших данных

var list:ArrayCollection = new ArrayCollection; 
for(var i:int = 0;i<200000;i++) 
{ 
    var obj:Object = new Object; 
    list.add(obj); 

} 

При выполнении вышеуказанного кода было увеличено на 20 Мбайт памяти браузера с гибким клиентом. Для другого сценария я попытался добавить объект сценария действия в коллекцию массива. Объект скрипта действия определен ниже.

public class Sample 
{ 
    public var id:int; 
    public var age:int; 
    public Sample() 
    { 
    } 

} 

При добавлении класса 200000 Sample в массивную коллекцию по-прежнему сохраняется утечка памяти 20 МБ.

var list:ArrayCollection = new ArrayCollection; 
for(var i:int = 0;i<200000;i++) 
{ 
    var obj:Sample = new Sample; 
    obj.id= i; 
    onj.age = 20; 
    list.add(obj); 

} 

Я даже попытался добавить Sample Objects в flex arrayList и массив, но проблема по-прежнему сохраняется. Может ли кто-нибудь объяснить, где эта избыточная память потребляется flex?

+2

Почему вы называете это «утечкой»? – ethrbunny

ответ

1

Запрашивать память для ОС занимает много времени, поэтому проигрыватель Flash Player запрашивает большие куски памяти (больше, чем это действительно необходимо), чтобы свести к минимуму количество этих запросов.

0

Я понятия не имею, если время выделения ОС больше, больше, мы говорим об среднем на 1,5-2 ГГц Cpu - даже мобильном. Но Бенуа на правильном пути. Одновременно сохраняются большие куски, чтобы избежать фрагментации кучи. Если память запрашивалась только в кусках размера, которые ей нужны одновременно, наряду с другими запросами ввода-вывода, системная память очень быстро фрагментируется. Когда эти фрагменты возвращаются в пространство ОС - если диспетчер памяти не получает запрос того же размера или меньше, он не может перераспределить этот кусок, тем самым теряя его видимый пул. Поэтому, чтобы избежать этой проблемы - Flash (и менеджер памяти) запрашивает 16 Мб за раз.

В вашем случае не имеет значения, если вы создали 1 объект или 100 000. Вы все равно начнете с минимум 16 Мб частной памяти (ака, что вы видите в диспетчере задач).

Механизм распределения флеш-памяти основан на Mozilla MMgc.
Вы можете прочитать об этом здесь: https://developer.mozilla.org/en-US/docs/MMgc