Разрешение интерпретации XML приводит к утечке памяти на 30 МБ - PullRequest
1 голос
/ 24 июля 2011

Если вы знакомы с E4X и XML в AS3, взгляните на это CRAZINESS.

У меня есть 420 КБ XML.Довольно большой, да.Его структура довольно проста:

<Nodes>
  <Node ID="1">
    <Element Name="A" />
    <Element Name="B" />
  </Node>
</Nodes>

У меня от 2 до 10 элементов в общей сложности и около 50 узлов.

Я храню все отдельные коллекции "Элементов" вСловарь, где ключом является значение атрибута Node ID.Не спрашивай, почему я так сделал, хорошо?У меня была веская причина для этого.

Хорошо, поэтому мы получили словарь с примерно 50 ключами, каждый из которых содержит значения, которые являются списками XMLL от 2 до 10 элементов.

Итак,Большой XML разбит на несколько списков XMLL и хранится в Словаре следующим образом:

for each (var obj: XML in objects)
  _SomeDictionary[int(obj.@ID)] = obj.Element;

Теперь вот странная часть:

  1. Запуск приложения.
  2. Инициализациянекоторые объекты используют 10 из 50 значений словаря.
  3. Потребление памяти: 36 МБ.

  1. Запуск приложения.
  2. Инициализация объектов с использованием ALL50 значений словаря.
  3. Потребление памяти: 47 МБ.

Но ... если я сделаю это так:

for each (var obj: XML in objects)
  _SomeDictionary[int(obj.@ID)] = String(obj.Element);

Я получу это:

  1. Запустить приложение.
  2. Инициализировать объекты, используя ВСЕ 50 значений словаря, и перед инициализацией вернуть значение словаря обратно в XMLList.
  3. Потребление памяти: 16 МБ .

Итак, я выбрал 30 МБ памяти, просто набрав thСписок XMLL для строки.Почему это происходит?В конце концов, внутри функции инициализации, которая обрабатывает значение словаря, ВСЕГДА будет создаваться список XML.

Второй вопрос: когда НЕ приведен тип String, ПОЧЕМУ увеличивается объем памяти, когда я обрабатываю значения словаря ???Это уже все списки XML!Почему объем памяти увеличивается только с 36 МБ до 47 МБ, когда я фактически извлекаю XML-список из словаря и просматриваю его с помощью функции, которая инициализирует некоторые объекты на его основе?

PS: функция невызывает утечку памяти: я уже доказал, что получаю только 16 МБ, когда использую ту же функцию, но вместо того, чтобы дать ему список XML, извлеченный непосредственно из словаря, я даю ему список XML, приведенный из строки, извлекаемой изсловарь.

1 Ответ

0 голосов
/ 25 июня 2015

Это может объяснить это.

во Flash ссылается на главную строку, даже если вы просто используете фрагмент:

var str:String = "ABCDEFGHIJKLMNOPQRSTUV".substr(0,2);
trace(str + " has master string " + flash.sampler.getMasterString(str));
// output: AB has master string ABCDEFGHIJKLMNOPQRSTUV
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...