我一直在AS3编程一段时间,发现一个非常奇怪的问题,因为没有明显的理由挂在内存中,下面的程序只是改变label.text属性随机字符串,它工作正常,但当我看着Flex Profiler我注意到字符串的数量稳步增加,我试图执行垃圾收集器,但没有帮助我。AS3字符串内存泄漏
这是内存泄漏吗?我该如何解决它?
据我所知,这个字符串应该被垃圾收集器收集,因为没有对象引用它们,但这并不是所有的字符串都会发生。
下面是代码和Flex分析器屏幕截图,显示了String实例的数量。
<?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希望以运行一些暂停。
如果在紧密的循环中非常快速地生成字符串,可能是垃圾收集器没有足够的时间来释放字符串。我只是在这里猜测,自从我做AS3工作已经有一段时间了。 10ms似乎并不是那么快,但我在AS3中看到了一些陌生的东西。你尝试过一个更慢的计时器吗? – xxbbcc
是的,实际上这是一个测试im与其他程序没有使用计时器相同的问题,也尝试通过Flex profiler接口强制垃圾收集器 – DooMMcQ
或者你可以尝试安装不同的播放器版本 - 我见过Adobe介绍当他们发布一个新版本时,他们经常会遇到主要的Flash Player错误。您的当前版本有可能存在GC错误。你的代码看起来正确。 – xxbbcc