【问题标题】:As3 Memory Leak? - How to garbage collect a newed as3 Sound Object from memory?As3 内存泄漏? - 如何从内存中垃圾收集新的 as3 声音对象?
【发布时间】:2012-10-19 07:08:59
【问题描述】:

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

所以,无论是否播放声道,它看起来都像声音对象 无法从内存中删除。

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

【问题讨论】:

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


【解决方案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);

【讨论】:

  • 感谢您的回答。我已经尝试过 LocalConnection 技巧,但在这种情况下它似乎没有效果。对数千帧的帧事件调用 System.gc 也不行。我在 Adob​​e As3 论坛上发布了同样的问题:forums.adobe.com/message/4814155#4814155 到目前为止,似乎可以肯定地得出以下结论: 1 在 Iphone 上进行测试时,问题并未表现出来。 2 使用桌面存在非重复性泄漏,或者没有,但由于桌面上的内存限制宽松,其操作系统从不释放它们。
猜你喜欢
  • 2012-01-03
  • 1970-01-01
  • 2018-05-10
  • 2012-06-28
  • 1970-01-01
  • 2012-11-28
  • 1970-01-01
  • 1970-01-01
  • 2023-03-04
相关资源
最近更新 更多