As3内存泄漏? - 如何从内存中垃圾收集新的as3声音对象?

时间:2012-10-29 22:31:22

标签: actionscript-3 memory-management memory-leaks garbage-collection audio

看起来只是简单地新建一个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在之后运行了一千次,最后一个值仍然存在。

因此,无论是否播放声道,它都看起来像声音对象 无法从记忆中删除。

请说我错了,告诉我为什么。 提前谢谢。

1 个答案:

答案 0 :(得分:-1)

尝试给它一点时间来呼吸,记忆可能不会立即释放。

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);