FLEX内存无法释放,详细见补充。还望高手不吝赐教,万分感激。
使用模块方式,每加载一次模块,内存就增加5-10M不等,而且不会释放。加载模块的代码是统一封装的,每次加载前,都会卸载之前的模块。加载卸载的代码如下:publicfunc...
使用模块方式,每加载一次模块,内存就增加5-10M不等,而且不会释放。
加载模块的代码是统一封装的,每次加载前,都会卸载之前的模块。加载卸载的代码如下:
public function load(url:String, container:Group = null, data:Object = null):void {
if(url == null || url == "null")
return;
unload();
_url = url;
_container = container;
_data = data;
doload();
}
public function unload():void {
if (_info != null) {
_info.unload();
_info = null;
}
MemoryUtils.gc();
}
public function get element():ILongtopModule {
return _element;
}
private function doload():void {
_info = ModuleManager.getModule(_url);
_info.addEventListener(ModuleEvent.READY, moduleReadyHandler, false, 0, true);
_info.addEventListener(ModuleEvent.ERROR, moduleErrorHandler, false, 0, true);
_info.load(ApplicationDomain.currentDomain);
}
尝试过在加载时,将模块加载到独立子域,可以解决内存问题,模块切换时可以释放内存,但与现有的很多代码不兼容,很多弹出界面就打不开了。具体原因未知。 展开
加载模块的代码是统一封装的,每次加载前,都会卸载之前的模块。加载卸载的代码如下:
public function load(url:String, container:Group = null, data:Object = null):void {
if(url == null || url == "null")
return;
unload();
_url = url;
_container = container;
_data = data;
doload();
}
public function unload():void {
if (_info != null) {
_info.unload();
_info = null;
}
MemoryUtils.gc();
}
public function get element():ILongtopModule {
return _element;
}
private function doload():void {
_info = ModuleManager.getModule(_url);
_info.addEventListener(ModuleEvent.READY, moduleReadyHandler, false, 0, true);
_info.addEventListener(ModuleEvent.ERROR, moduleErrorHandler, false, 0, true);
_info.load(ApplicationDomain.currentDomain);
}
尝试过在加载时,将模块加载到独立子域,可以解决内存问题,模块切换时可以释放内存,但与现有的很多代码不兼容,很多弹出界面就打不开了。具体原因未知。 展开
3个回答
展开全部
我查看了一下官方的文档,因为IModuleInfo的load方法只是加载模块,而不是创建模块的实例。如果你在其他地方使用ModuleLoader标签或者通过_info创建模块的实例了,模块也不能别完全卸载,而只是作为垃圾回收的对象。
但是,对于垃圾回收,有个问题。
1、垃圾的回收不可预知。(调用MemoryUtils.gc();方法并不一定会触发垃圾回收)
2、只有在请求内存的时候才会触发垃圾回收,而不是在删除对象引用时。
另外,对于你的代码,你可以确认一下,对于同一个module来说,你是否调用的是同一个类实例(上面你贴出的这些方法所在的类)的load和unload方法,且该类实例是否被其他对象长期持有?
在调用_info.unload();方法前,调用_info.release()方法将当前的引用释放到模块中。
总的来说,你一定要确保该对该模块实例的引用、对_info的引用确实已经都删除了,才能真正的完全卸载模块。 (样式、时间这些都可能导致你不能正常卸载模块,详细的请查看参考资料。)
但是,对于垃圾回收,有个问题。
1、垃圾的回收不可预知。(调用MemoryUtils.gc();方法并不一定会触发垃圾回收)
2、只有在请求内存的时候才会触发垃圾回收,而不是在删除对象引用时。
另外,对于你的代码,你可以确认一下,对于同一个module来说,你是否调用的是同一个类实例(上面你贴出的这些方法所在的类)的load和unload方法,且该类实例是否被其他对象长期持有?
在调用_info.unload();方法前,调用_info.release()方法将当前的引用释放到模块中。
总的来说,你一定要确保该对该模块实例的引用、对_info的引用确实已经都删除了,才能真正的完全卸载模块。 (样式、时间这些都可能导致你不能正常卸载模块,详细的请查看参考资料。)
参考资料: http://blogs.adobe.com/aharui/2009/08/what_we_know_about_unloading_m.html
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询