[转] 加载SWF时一些有趣的测试

这几天做了一个关于加载和内存变化.以及被加载文件的清除的测试;

小有心得~不敢独享,摆到这里让各位大大拍砖;
代码如下:
public class LoadArrangeMain extends Sprite
{

public function LoadArrangeMain()
{
init();
}
private function init():void {

trace("start Memory : " + System.totalMemory);

loadStart();
}
private function loadStart():void {
var loader:Loader = new Loader();
var loadcontext:LoaderContext = new LoaderContext(false, ApplicationDomain.currentDomain);
loader.load(new URLRequest("loadSwf.swf"), loadcontext);
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, completeHandle);

}
private function completeHandle(e:Event):void {
trace("loaded Memory : " + System.totalMemory)
trace(" IS HAS definetion atem? " +ApplicationDomain.currentDomain.hasDefinition("com.loadedSwf.Atem"));
e.currentTarget.removeEventListener(e.type, arguments.callee);
var loader:Loader = e.currentTarget.loader as Loader;
var loadSwf :*= loader.content;
stage.addEventListener(MouseEvent.CLICK, loadSwf.showMessage,false,0,true);
loadSwf = null;
loader.unloadAndStop(true);
loader = null;
//gc();
setTimeout(getDefinition, 3 * 1000);
}

private function getDefinition():void {
trace("unloaded Memory : " + System.totalMemory)
trace(" IS HAS definetion atem? " +ApplicationDomain.currentDomain.hasDefinition("com.loadedSwf.Atem"));
}
private function gc():void {
try {
var local_1:LocalConnection = new LocalConnection();
var local_2:LocalConnection = new LocalConnection();

local_1.connect("foo");
local_2.connect("foo");
}catch (e:Error) {
trace("GC\n")
}

}
}
复制代码
输出结果为:
start Memory : 3006464
loaded Memory : 3866624
IS HAS definetion atem? true
unloaded Memory : 3690496
IS HAS definetion atem? true

加入SWF 后内存增加了 860000 B左右,通过unload 和GC之后 约小了 200000 左右;
那么剩下的是什么呢?
继续测试:
var arr:Array=[];
var loaders:Array=[];
for (var i:int=0;i<50;i++){
arr.push("loadSwf.swf");
}
load();

private function load(e:Event=null):void{
if(arr==ull|| arr.length<1) complete();
var loader:loader=new Loader();
loader.load(new URLRequest(arr.shift()));
loader.contentLoadInfo.addEventLsiener(Event.COMPLETE,load);
loaders.push(loader);
}

private function complete():void{
trace ("loaded memory :"+System.totalMemory);
for each(var loader:Loader in loaders){
laoder.unloadAndStop(false);
loader=null;
}
loaders=null;
setTimerOut(showMemory,3*1000);
}

private function showMemory():void{
trace("lasted Memory:"+System.totalMemory);
}
复制代码
输出结果:
start memory 3035136
loaded memory 7426048
unload memory 4116480


通过后面的输出,我才知道~SWF被unload之后和我以为的清除存在着天壤之别;
它含有的类信息,已经被遍译好留在内存中了,而且如果此类绑到了库的素才,那占用的内存也会更大。

那么,第一个测试中我还给主SWF加了一个MouseEvnet.CLICK的弱引用,侦听器是 loadSwf实例中的公开方法;
常理,我们unload掉 该实例后 弱引用就会被清除了,可结果我测试出乎意料,一直都会响应!也就是 被加载的SWF 实例仍在内存中!
这个原因,深表遗憾,我实在是没有研究出来,我会在后面继续追加,如果有哪位大大知道具体原因,也希望你在跟贴中指点一二。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值