【发布时间】:2014-07-08 22:07:06
【问题描述】:
在创建 StageWebView 的实例时,如果您在多个站点之间切换,您会注意到使用的内存量会缓慢上升。如果您正在查看 2/3 的站点,这不是问题,但是在使用内置浏览器创建 AIR 应用程序时,我现在在内存管理方面遇到了障碍。
不管我做什么
- 每次调用后的 StageWebView.dispose()
- 重置阶段
问题仍然存在。每次加载网页都会增加 3mb 的内存,逐渐增加到 1gb 以上并导致应用程序崩溃。
我在 StageWebView 实例上没有事件侦听器。我绝对没有提到它。在第二个 URL 加载后,内存并没有完全重置。
这可以通过在 AIR 中运行以下命令来看到:
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();
}
}
}
有人有这方面的经验吗?
【问题讨论】:
-
使用不推荐使用的全局方法(如 setInterval)和使用匿名函数很难证明内存泄漏。也许这更像是一种显示代码风格的方式,这可能会导致内存泄漏。
-
周末我会写一些合法的代码。我无法发布生产代码。感觉有些缓存留在内存中,我无法找到解决方法。
-
StageWebView 自 AIR 2.5 以来一直存在,如果它如此容易产生内存泄漏,我想我们现在应该知道了。
-
@BotMaster 已更新。运行上面的代码并查看加载时的内存使用情况。然后,单击加载 URL 4 次,让每个 URL 完全加载。然后,单击运行 GC。现在比较两个内存值。
-
作为比较,我在启动时得到 25,460k,在 GC 后得到 75,600k。
标签: actionscript-3 air