我一直在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