AS3字符串内存泄漏(AS3 String Memory Leak)

2019-09-23 21:22发布

我一直在编程在AS3一段时间后发现一个很奇怪的问题与无缘无故被挂在存储串,下面只是节目改变与一个随机字符串的label.text属性,它工作正常,但是当我看着Flex的探查我注意到,弦数steadly增加,我试过执行垃圾收集器但没有帮助我。

这是内存泄漏? 我该如何解决呢?

当我知道这个字符串应该被垃圾收集器收集,因为没有对象引用它们,然而,这是不会发生的所有字符串。

继承人的代码和Flex探查表示字符串的实例的数目的屏幕截图。

<?xml version="1.0" encoding="utf-8"?>
<s:WindowedApplication xmlns:fx="http://ns.adobe.com/mxml/2009" 
                   xmlns:s="library://ns.adobe.com/flex/spark" 
                   xmlns:mx="library://ns.adobe.com/flex/mx" creationComplete="windowedapplication1_creationCompleteHandler(event)">
<s:layout>
    <s:BasicLayout/>
</s:layout>
<fx:Script>
    <![CDATA[
        import mx.events.FlexEvent;

        protected var t:Timer=new Timer(10);

        protected function windowedapplication1_creationCompleteHandler(event:FlexEvent):void
        {
            t.addEventListener(TimerEvent.TIMER,listener,false,0,true);
            t.start();
        }

        protected function listener(e:Event):void
        {
            var s:String=Math.random()+"-->";
            this.fx(s);
            s=null;
        }

        protected function fx(s:String):void
        {
            this.label.text=s;
        }
    ]]>
</fx:Script>
<fx:Declarations>
    <!-- Place non-visual elements (e.g., services, value objects) here -->
</fx:Declarations>
<s:Label id="label" y="39" left="10" right="10" text="Label"/>
</s:WindowedApplication>

对不起,不到10分,继承人的剖析截图http://imageshack.us/a/img11/9716/stackw.png

解决了

巴里斯和Loxxy你是对的,我为了找出问题做了一些改变,它长到〜30MB那么垃圾回收器释放一些内存,它永远不会追溯到〜2MB(起点),但图形开始从去〜20MB到30MB〜遍地。

继承人的代码来测试这个

<?xml version="1.0" encoding="utf-8"?>
<s:WindowedApplication xmlns:fx="http://ns.adobe.com/mxml/2009" 
                   xmlns:s="library://ns.adobe.com/flex/spark" 
                   xmlns:mx="library://ns.adobe.com/flex/mx" creationComplete="windowedapplication1_creationCompleteHandler(event)">
<s:layout>
    <s:BasicLayout/>
</s:layout>
<fx:Script>
    <![CDATA[
        import mx.events.FlexEvent;
        protected var maxMemoryUsage:Number=0;
        protected var i:Number=0;

        protected function windowedapplication1_creationCompleteHandler(event:FlexEvent):void
        {
            setTimeout(Fx,20);
        }

        protected function Fx():void
        {
            if(i++%1024==0) 
            {
                var mem:Number=System.totalMemory;
                this.maxMemoryUsage = mem>this.maxMemoryUsage?mem:this.maxMemoryUsage;
                trace(this.maxMemoryUsage + ' / ' + mem);
            }

            var s:String="";
            s+=Math.random().toString()+"qwertyuiu...1024 random chars...iiwqe";
            this.aSimpleString=s;
            setTimeout(Fx,20);
        }
    ]]>
</fx:Script>
<fx:Declarations>
    <!-- Place non-visual elements (e.g., services, value objects) here -->
    <fx:String id="aSimpleString"/>
</fx:Declarations>
</s:WindowedApplication>

还呼吁对System.gc()什么也没做,也许是GC希望以运行一些暂停。

Answer 1:

垃圾收集器将运行时感觉。 它通常发生在分配新对象,但如果内存使用率不高,可能不是你的情况发生。

你可以尝试调用System.gc() ,看它是否释放这些字符串。 但是,你不应该使用在你的产品代码。

见这个答案获取更多信息。



Answer 2:

难道你写了一个计时器推荐的延迟下方运行? new Timer(10);

从这里

不推荐超过20毫秒下的延迟。 计时器频率限制为每秒60帧,这意味着延迟低于16.6毫秒导致运行时问题。

正如巴里斯前面所说的,人们碰到的在自己的应用程序内存负载是当神奇GC到达解决内存问题。 除此之外,你也不需要担心它也不能手动做任何事情。



Answer 3:

这可能与主路线 ,即Flash运行时使用,以尽量减少串数据的相关区块的冗余分配的内存优化。

你可以阅读关于这个博客帖子现实世界的影响进行详细分析的Flash字符串的怪事 。

下面是相关的,这样后一些亮点:

结果

  • 如果你从一长串需要将部分字符串,它会保持很长的字符串。
  • 如果你加入2名以上的字符串,它会保持在第二个字符串作为主路线。
  • 如果你遍历并添加字符串连接在一起,这将是与上面相同,它会开始保持从第三除主字符串。
  • 起圈串测试似乎表明,每串可以有父母链。
  • 这不能效法,因为我们只能接触到“getMasterString()”,它返回链的根。

...

结论

  • 字符串有“父字符串”
  • XML不断引用到它的父字符串(S)
  • 字符串会出现内存泄漏
  • 控制台图形出现泄漏由于上述原因


文章来源: AS3 String Memory Leak