Flash Builder 4 Profiler:如何发现导致已知内存增加的对象? [英] Flash Builder 4 Profiler: how to spot what objects are causing a known memory increase?

查看:15
本文介绍了Flash Builder 4 Profiler:如何发现导致已知内存增加的对象?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我知道分析器的问题可能很笼统,但在这里我有一个非常具体的问题和示例.

I know profiler questions can be quite general, but here I have a very specific question and example.

我知道在以下代码中(取自 Joshua 的问题),无限数量的 circle 对象实例被添加到 hostComponent.这显然会导致应用程序逐渐变慢.

I know that in the following code (taken from Joshua's question), that an infinite number of circle object instances are being added to the hostComponent. This obviously causes gradual slowing down of the app.

我的问题是,当我运行 Flash Builder Profiler 时,我究竟在哪里看到问题所在?

My question is, when I run the Flash Builder Profiler, where exactly do I see where the problem lies?

运行应用示例

要尝试一下,请创建一个新的 Flex 4 项目,并粘贴以下代码:

To try it out, create a new Flex 4 project, and paste in this code:

<?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" minWidth="955" minHeight="600"
               initialize="onInit()" viewSourceURL="srcview/index.html">
    <fx:Script>
        <![CDATA[
            import mx.core.UIComponent;
            import mx.effects.Fade;         
            import spark.effects.Move;

            private var hostComponent:UIComponent;

            private function onInit():void{

                hostComponent = new UIComponent();
                hostComponent.id = "circleHostComponent";
            }

            /* Add circle UIComponent objects to the hostComponent.
                Move and Fade the circle objects */
            private function onTimerEvent(event:TimerEvent):void{  

                var yPos:Number = Math.ceil(Math.random()*100);
                var radius:Number = Math.ceil(Math.random()*5); //1-12
                var effectAlpha:Number = Math.random()*0.5 + 0.2 // 0-1
                var effectDuration:Number = Math.ceil(Math.random()*3000) + 1000;

                var circle:UIComponent = new UIComponent();
                circle.graphics.beginFill(0x1C75BC, effectAlpha);
                circle.graphics.drawCircle(90, yPos, radius);
                circle.graphics.endFill();

                hostComponent.addChild(circle);

                var moveEffect:Move= new Move(circle);
                moveEffect.xBy = 300;
                moveEffect.duration = effectDuration;

                moveEffect.play(); 

                var fadeEffect:Fade = new Fade(circle);
                fadeEffect.alphaFrom = 1;
                fadeEffect.alphaTo = 0;
                fadeEffect.duration = effectDuration;

                fadeEffect.play();

                this.addElement(hostComponent);

            }

            private function onClick():void{
                startButton.enabled = false;
                var t:Timer = new Timer(100, 0);
                t.start();
                t.addEventListener(TimerEvent.TIMER, onTimerEvent);

            }       

        ]]>
    </fx:Script>

    <fx:Declarations>
        <!-- Place non-visual elements (e.g., services, value objects) here -->
    </fx:Declarations>

    <s:Button id="startButton" label="Click to Start" click="onClick()" />
</s:Application>

推荐答案

首先,我会在玩了一下应用程序后查看 Memory Usage 面板:

First, I would look at the Memory Usage panel after playing a bit with the application :

注意内存越来越大.有一个运行垃圾收集器"按钮可以强制执行 GC.但是,当您单击它时,内存不会减少.

Notice the memory increases more and more. There is a "Run Garbage Collector" button that forces the GC. However, when you click on it, the memory doesn't decrease.

下一步是确定罪魁祸首.为此,您可以使用 Live Objects 面板:

The next step is to identify the culprits. For that, you use the Live Objects panel :

看起来是这样,分配一些 Vector 实例,一切看起来都很好.默认情况下,从活动对象数据网格中过滤了许多类.幸运的是,可以指定将显示和隐藏哪些类.默认情况下, flash.x.x 包中的所有类都是隐藏的.从过滤列表中删除它们会给表格带来一些有趣的东西:

It looks like that, appart some Vector instances, everything looks allright. By default, a lot of classes are filtered from the live objects datagrid. Fortunately, one can specify which classes will be displayed and hidden. All classes from the flash.x.x packages are hidden by default. Removing them from the filtered list bring somthing interesting to the table :

注意 Graphics 行:871 个实例已经创建,它们都还在内存中!有了这些信息,您可以假设 Graphics 实例是导致应用程序变慢的原因.如果您还过滤掉 mx.* 类,您将看到有 871 个 UIComponents 实例.每次创建 UIComponent 时,也会实例化一个 Graphics 对象.

Notice the Graphics row : 871 instances have been created and they are all still in memory! With that info, you can suppose the Graphics instances are responsible of the slow down of the application. If you also filter out the mx.* classes, you will see there are 871 UIComponents instances. Everytime a UIComponent is created, there is a Graphics object also instancied.

最后一步是在屏幕上不再需要每个 UIComponent 时将其移除,并查看是否有任何性能改进.

Final step is to remove each UIComponent once it's no more needed on screen and look if there is any performance improvement.

这篇关于Flash Builder 4 Profiler:如何发现导致已知内存增加的对象?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆