我查看了一下官方的文档,因为IModuleInfo的load方法只是加载模块,而不是创建模块的实例。如果你在其他地方使用ModuleLoader标签或者通过_info创建模块的实例了,模块也不能别完全卸载,而只是作为垃圾回收的对象。
但是,对于垃圾回收,有个问题。
1、垃圾的回收不可预知。(调用MemoryUtils.gc();方法并不一定会触发垃圾回收)
2、只有在请求内存的时候才会触发垃圾回收,而不是在删除对象引用时。
另外,对于你的代码,你可以确认一下,对于同一个module来说,你是否调用的是同一个类实例(上面你贴出的这些方法所在的类)的load和unload方法,且该类实例是否被其他对象长期持有?
在调用_info.unload();方法前,调用_info.release()方法将当前的引用释放到模块中。
总的来说,你一定要确保该对该模块实例的引用、对_info的引用确实已经都删除了,才能真正的完全卸载模块。 (样式、时间这些都可能导致你不能正常卸载模块,详细的请查看参考资料。)
尝试过在加载时,将模块加载到独立子域,可以解决内存问题,模块切换时可以释放内存,但与现有的很多代码不兼容,很多弹出界面就打不开了。具体原因未知。
模块暂用内存不释放应该还有引用的地方,把引用的地方也置空