#memory-leaks #flex4 #mxml #flash-builder4.5
#утечки памяти #flex4 #mxml #flash-builder4.5
Вопрос:
Я создаю простое видеоприложение на основе состояния Flex View на Flash Builder 4.5. Существует 4 состояния. Каждый раз, когда я перехожу из состояния 1-> Состояния 2-> состояния 3 или состояния 1-> Состояния 2-> состояния 4, объем памяти в Internet Explorer увеличивается, но не освобождается. Что я не освобождаю?
Должен ли я вручную освобождать каждый отдельный элемент и его прослушиватели событий для каждого состояния?
У меня установлена версия Flash Player 10,2,153,1.
Исходный код можно загрузить здесь, если вы хотите создать приложение и запустить.
вот основной код:
<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx"
width.State1="1024" height.State1="768"
width.State2="1024" height.State2="768"
width.State3="1024" height.State3="768"
width.State4="1024" height.State4="768">
<fx:Script>
<![CDATA[
protected function button1_clickHandler(event:MouseEvent):void
{
// TODO Auto-generated method stub
currentState='State2';
}
protected function button2_clickHandler(event:MouseEvent):void
{
// TODO Auto-generated method stub
currentState='State3';
}
protected function button3_clickHandler(event:MouseEvent):void
{
// TODO Auto-generated method stub
currentState='State1';
}
protected function button4_clickHandler(event:MouseEvent):void
{
// TODO Auto-generated method stub
currentState='State2';
}
protected function button5_clickHandler(event:MouseEvent):void
{
// TODO Auto-generated method stub
currentState='State4';
}
]]>
</fx:Script>
<s:states>
<s:State name="State1" />
<s:State name="State2"/>
<s:State name="State3"/>
<s:State name="State4"/>
</s:states>
<fx:Declarations>
<!-- Place non-visual elements (e.g., services, value objects) here -->
</fx:Declarations>
<s:Button includeIn="State1" x="405" y="175" width="227" height="73" label="Music List"
click="button1_clickHandler(event)" fontSize="30" itemDestructionPolicy="auto" />
<s:Label includeIn="State1" x="440" y="61" fontSize="30" text="Main State" itemDestructionPolicy="auto"/>
<s:Label includeIn="State2" x="409" y="34" fontSize="30" text="Classical Video" itemDestructionPolicy="auto"/>
<s:Button includeIn="State2" x="328" y="151" width="369" height="91"
label="Beethoven - amp;quot;Für Eliseamp;quot;" click="button2_clickHandler(event)"
fontSize="30"
itemDestructionPolicy="auto"
/>
<s:VideoPlayer includeIn="State3,State4" x="0" y="67" width="1024" height="530" autoPlay="false"
loop="true" scaleMode="stretch" source="assets/Beethoven__Für_Elise.mp4"
source.State4="assets/FOUR_SEASONS_VIVALDI_LANDSCAPES_AND_MUSIC.mp4"
itemDestructionPolicy="auto"
/>
<s:Button includeIn="State3,State4" x="2" y="14" width="240" height="45" label="Return to Main"
click="button3_clickHandler(event)" fontSize="30"
itemDestructionPolicy="auto"
/>
<s:Button includeIn="State3,State4" x="338" y="629" width="348" height="63" label="Return to classical"
click="button4_clickHandler(event)" fontSize="30"
itemDestructionPolicy="auto"
/>
<s:Button includeIn="State2" x="326" y="287" width="371" height="81"
label="Vivaldi – “Four Seasons”" click="button5_clickHandler(event)" fontSize="30"
itemDestructionPolicy="auto"
/>
</s:Application>
Вид с точки обнаружения зависания objects(http://help.adobe.com/en_US/flashbuilder/using/WSe4e4b720da9dedb5510654d812e4d126514-8000.html#WS6f97d7caa66ef6eb1e63e3d11b6c4d0d21-7ee8 ) находится здесь
Просмотр из объекта references(http://help.adobe.com/en_US/flashbuilder/using/WSe4e4b720da9dedb5510654d812e4d126514-8000.html#WS6f97d7caa66ef6eb1e63e3d11b6c4d0d21-7eef ) из самого верхнего объекта в «представлении праздношатающихся объектов» находится здесь
Я проверил документацию для «Управления кэшированием объектов, созданных в состоянии просмотра» и установил itemDestructionPolicy=»auto». Он по-прежнему кэширует объекты, и память не освобождается, как видно из диспетчера задач.
Комментарии:
1. Это постоянно увеличивается? Например, если вы часто меняете состояния, они никогда не собираются или проходят только через эти состояния. GC не будет запускаться, если в этом нет необходимости, и что заставляет его запускаться, так это когда требуется выделить больше объектов, он должен очистить память.
2. это не постоянно увеличивается, это серьезная утечка памяти. Это происходит только тогда, когда вы очень часто меняете состояния посредством взаимодействия. Когда запускается GC — на каком пределе?
3. livedocs.adobe.com/flex/3/html/… Вот ссылка на GC для flex. В принципе, он будет запускаться, когда это необходимо, я обнаружил, что иногда это означает, что, поскольку он находится рядом с максимальной памятью, разрешенной для программы, он будет выполнять большую сборку мусора по мере выделения новых объектов.
4. спасибо, Майк; новая ссылка help.adobe.com/en_US/flashbuilder/using/… . больше всего поражает «Итак, когда вы удаляете все ссылки на объект, сборщик мусора не обязательно освобождает память для этого объекта. Этот объект становится кандидатом на сборку мусора «. например, на компьютере объемом 1 ГБ, когда начнется сборщик мусора?
5. Если вы наблюдаете за своим профилировщиком во время использования приложения, вы действительно сможете увидеть, как это происходит. Я лично мало что знаю о его внутренностях, но из того, что я собрал из своих собственных исследований, он будет использовать как можно больше памяти, прежде чем он действительно выполнит сбор. И, как вы указали, простое удаление всех ссылок на объект делает его кандидатом на GC, поскольку сборщик запускается только тогда, когда новым объектам требуется память, GC очистит достаточное количество кандидатов для создания необходимого пространства. Также следует отметить: вы не можете программно принудительно использовать GC в своем коде.