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

标签 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之后运行一千次,最后的值仍然保留。

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

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

最佳答案

尝试稍作呼吸,可能不会立即释放内存。

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/

相关文章:

actionscript-3 - Return 和 numpad Enter 的区别

linux - page fault exception 抛出时,OS 是如何定位磁盘上还没有加载到内存中的内容的?

.net - 如何避免 .NET SSLStream 中的内存泄漏

Java3D离屏渲染内存泄漏

flash - 有没有办法强制 PDF 在 Adob​​e Reader 而不是插件中打开?

actionscript-3 - 闪存 AS3 :Multiple function in one key?

windows - 内核内存地址空间

iOS 内存管理问题

c++ - 修复 std::map 中的碰撞内存泄漏

flash - 想要最好的 Flash (ActionScript 3) 游戏开发工具链?