首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >HTMLLoader / StageWebView内存泄漏

HTMLLoader / StageWebView内存泄漏
EN

Stack Overflow用户
提问于 2014-07-08 22:07:06
回答 1查看 1.1K关注 0票数 3

在创建StageWebView实例时,如果在多个站点之间切换,您会注意到所使用的内存量缓慢上升。如果您正在查看2/3站点,这不是一个问题,但在使用内置浏览器创建AIR应用程序时,我现在在内存管理方面遇到了麻烦。

不管我做什么

  • 每次调用后的StageWebView.dispose()
  • 复位级

问题依然存在。网页的每一次加载都会增加3mb的内存,这将逐渐增加到1gb以上,并使应用程序崩溃。

我在StageWebView实例上没有事件侦听器。我绝对没有提到它。内存只是没有完全重置后,第二个URL加载。

这可以从空气中运行下面的内容中看到:

代码语言:javascript
复制
package kazo
{
    import flash.events.Event;
    import flash.events.MouseEvent;
    import flash.geom.Rectangle;
    import flash.media.StageWebView;
    import mx.controls.Button;
    import mx.core.UIComponent;
    import flash.system.System;

    /**
     * ...
     * @author KM
     */
    public class Controller extends UIComponent
    {

        private var stageWeb:StageWebView;
        private var url:uint = 0;

        private const URL_ARRAY:Array = [
            'http://www.mmo-champion.com/',
            'http://www.bbc.co.uk/news/',
            'http://www.twitch.tv/riotgames/',
            'http://www.stackoverflow.com/'
        ]

        /**
         * 
         */
        public function Controller() 
        {
            addEventListener(Event.ADDED_TO_STAGE, init);
        }

        /**
         * 
         * @param   e
         */
        private function init(e:Event):void {
            removeEventListener(Event.ADDED_TO_STAGE, init);

            stageWeb = new StageWebView();
            stageWeb.stage = stage;
            stageWeb.viewPort = new Rectangle(0, 80, width, height - 50);

            var btn:Button = new Button();
            addChild(btn);
            btn.label = 'Load URL';
            btn.x = 0;
            btn.y = 10;;
            btn.width = 100;
            btn.height = 30;
            btn.addEventListener(MouseEvent.CLICK, load);

            btn = new Button();
            btn.label = 'Try to GC';
            btn.x = 150;
            btn.y = 10;;
            btn.width = 100;
            btn.height = 30;
            addChild(btn);
            btn.addEventListener(MouseEvent.CLICK, tryGC);

            /// 26,576k
        }

        /**
         * 
         * @param   e
         */
        private function load(e:MouseEvent):void {
            if (!stageWeb) {
                stageWeb = new StageWebView();
                stageWeb.stage = stage;
                stageWeb.viewPort = new Rectangle(0, 80, width, height - 50);
            }               

            stageWeb.loadURL(URL_ARRAY[url % 4]);

            url++;
        }

        /**
         * 
         * @param   e
         */
        private function tryGC(e:MouseEvent):void {
            stageWeb.stage = null;
            stageWeb.viewPort = null;
            stageWeb.dispose();
            stageWeb = null;
            System.gc();
        }

    }

}

有人有这方面的经验吗?

EN

回答 1

Stack Overflow用户

发布于 2014-07-17 12:13:45

我对您的代码做了一些小的修改,使其可以用AIR 14 SDK (ASC2.0,没有flex)编译,我用

mxmlc -optimize=true +configname=air Controller.as && adl Controller.xml

以及使用Adobe查看内存使用情况。

GC后内存稳定,稳定在14481 kB。

您可以在mxmlc中添加-advanced-telemetry=true选项来精确跟踪分配/释放位置,只需考虑按下“隐藏清理对象”开关,并选择两个GC之间的范围。您将看到某些对象不是立即释放的,但您也会看到,如果同时选择这些范围中的几个,那么这些临时泄漏就不会加起来,这就解释了为什么内存没有不断增加,在GC环境中,内存泄漏并不是真正的内存泄漏。

如何测量内存使用情况?

我检查了adl进程的内存使用情况,它更高(>100 GC ),不太稳定,但在GC之后仍然稳定在110到120 GC之间。在任何情况下,它绝对不是看起来它将增加高达1GB。

请记住,ActionScript GC是懒惰的,并且为将来的重用保留了大量的对象,任何比hello做得更多的应用程序有时都会有奇怪的内存行为,这是AVM2工作方式的一部分。

代码语言:javascript
复制
package 
{
    import flash.display.Sprite;
    import flash.events.Event;
    import flash.events.MouseEvent;
    import flash.geom.Rectangle;
    import flash.media.StageWebView;
    import flash.system.System;
    import flash.text.TextField;

    /**
     * ...
     * @author KM
     */
    public class Controller extends Sprite
    {

        private var stageWeb:StageWebView;
        private var url:uint = 0;

        private const URL_ARRAY:Array = [
            'http://www.mmo-champion.com/',
            'http://www.bbc.co.uk/news/',
            'http://www.twitch.tv/riotgames/',
            'http://www.stackoverflow.com/'
        ]

        /**
         * 
         */
        public function Controller() 
        {
            addEventListener(Event.ADDED_TO_STAGE, init);
        }

        /**
         * 
         * @param   e
         */
        private function init(e:Event):void {
            removeEventListener(Event.ADDED_TO_STAGE, init);

            stageWeb = new StageWebView();
            stageWeb.stage = stage;
            stageWeb.viewPort = new Rectangle(0, 80, stage.stageWidth, stage.stageHeight - 50);

            var btn:TextField = new TextField();
            btn.selectable = false;
            addChild(btn);
            btn.text = 'Load URL';
            btn.x = 0;
            btn.y = 10;;
            btn.width = 100;
            btn.height = 30;
            btn.addEventListener(MouseEvent.CLICK, load);

            btn = new TextField();
            btn.selectable = false;
            btn.text = 'Try to GC';
            btn.x = 150;
            btn.y = 10;;
            btn.width = 100;
            btn.height = 30;
            addChild(btn);
            btn.addEventListener(MouseEvent.CLICK, tryGC);

            /// 26,576k
        }

        /**
         * 
         * @param   e
         */
        private function load(e:MouseEvent):void {
            if (!stageWeb) {
                stageWeb = new StageWebView();
                stageWeb.stage = stage;
                stageWeb.viewPort = new Rectangle(0, 80, stage.stageWidth, stage.stageHeight - 50);
            }               

            stageWeb.loadURL(URL_ARRAY[url % 4]);

            url++;
        }

        /**
         * 
         * @param   e
         */
        private function tryGC(e:MouseEvent):void {
            stageWeb.stage = null;
            stageWeb.viewPort = null;
            stageWeb.dispose();
            stageWeb = null;
            System.gc();
        }

    }

}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24642285

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档