在创建StageWebView实例时,如果在多个站点之间切换,您会注意到所使用的内存量缓慢上升。如果您正在查看2/3站点,这不是一个问题,但在使用内置浏览器创建AIR应用程序时,我现在在内存管理方面遇到了麻烦。
不管我做什么
问题依然存在。网页的每一次加载都会增加3mb的内存,这将逐渐增加到1gb以上,并使应用程序崩溃。
我在StageWebView实例上没有事件侦听器。我绝对没有提到它。内存只是没有完全重置后,第二个URL加载。
这可以从空气中运行下面的内容中看到:
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();
}
}
}有人有这方面的经验吗?
发布于 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工作方式的一部分。
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();
}
}
}https://stackoverflow.com/questions/24642285
复制相似问题