gpt4 book ai didi

actionscript-3 - AS3 字符串内存泄漏

转载 作者:行者123 更新时间:2023-12-04 06:43:52 25 4
gpt4 key购买 nike

我已经在 AS3 中编程了一段时间,发现一个非常奇怪的问题,字符串无缘无故地卡在内存中,下面的程序只是用随机字符串更改 label.text 属性,它工作正常但是当我查看 Flex 分析器时,我注意到字符串的数量在稳步增加,我尝试执行垃圾收集器但没有帮助我。

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

据我所知,这个字符串应该由垃圾收集器收集,因为没有对象引用它们,但并非所有字符串都会发生这种情况。

下面是 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 需要一些暂停才能运行。

最佳答案

垃圾收集器会随时运行。通常它发生在分配新对象时,但如果内存使用率不高,它可能不会发生。

您可以尝试调用 System.gc() 以查看它是否释放了这些字符串。但是您不应该在生产代码中使用它。

参见 this回答更多信息。

关于actionscript-3 - AS3 字符串内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12821553/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com