我已经在AS3中编程一段时间了,发现一个非常奇怪的问题,字符串没有任何明显原因却一直停留在内存中。下面的程序只是将label.text属性更改为随机字符串,它运行得很好,但当我查看Flex分析器时,我注意到字符串数量在稳步增加,我尝试执行垃圾回收器但没有帮助。
这是一个内存泄漏吗?我该如何解决?
据我所知,这些字符串应该被垃圾回收器收集,因为没有对象引用它们,但并非所有字符串都是这样。
以下是代码和Flex分析器截图显示的String实例数量。
这是一个内存泄漏吗?我该如何解决?
据我所知,这些字符串应该被垃圾回收器收集,因为没有对象引用它们,但并非所有字符串都是这样。
以下是代码和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
已解决
Baris和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需要一些暂停才能运行。