看起来像只是简单地更新了一个as3声音对象,并将其引用设置回null都会造成内存泄漏,无论它是否已被用来在其上播放SoundChannel。
例如,使用下一个文本代码:
package
{
import flash.display.*;
import flash.events.*;
import flash.media.*;
import flash.system.*;
import flash.utils.*;
import flash.system.*;
public class Main extends Sprite
{
[Embed(source = "../data/SongScene8.mp3")] protected var SongScene8:Class;
public function Main():void
{
if (stage) init();
else addEventListener(Event.ADDED_TO_STAGE, init);
}
private function init(e:Event = null):void
{
removeEventListener(Event.ADDED_TO_STAGE, init);
System.gc();
trace("Before");
trace(System.totalMemory);
trace("_________________")
var sound:Sound = new SongScene8();
System.gc();
trace("After new");
trace(System.totalMemory);
trace("_________________")
sound = null;
System.gc();
trace("After null");
trace(System.totalMemory);
}
}
}
输出为:
之前
3461120
新后
3604480
空后
3604480
即使gc之后运行一千次,最后的值仍然保留。
因此,无论是否播放了声道,它看起来都像声音对象
无法从内存中删除。
请说我错了,然后告诉我为什么。
提前致谢。
最佳答案
尝试稍作呼吸,可能不会立即释放内存。
sound = null;
System.gc();
trace('After null');
trace('Instantly: ' + System.totalMemory);
setTimeout(function():void
{
trace('2 seconds later: ' + System.totalMemory);
},
2000);
另请注意,
System.gc
仅在AIR和Flash Player的调试器版本中有效!根据an old article from gskinner,有一个技巧可以强制立即释放,两次调用
LocalConnection.connect
。不确定它的可靠性如何,但是快速测试表明它似乎有效:sound = null;
try {
new LocalConnection().connect('foo');
new LocalConnection().connect('foo');
} catch (e:*) {}
trace('After null');
trace('Instantly: ' + System.totalMemory);
关于actionscript-3 - As3内存泄漏? -如何从内存中垃圾收集新的as3声音对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13130614/