在今年3月份的一组文章中,我探讨了Gaia网站框架结合Robotlegs的MVC开发方式。这套机制在接下来半年的项目中运行良好,也积累了一些实战经验。但是自从用上了FDT4的Profiler功能以后,就发现了这套框架下存在的内存泄漏问题。一般的Agency/Studio网站页面较少,也不会有较长时间的停留时间和大量的加载卸载,问题还不甚明显。但是一旦项目规模上去以后,这种问题就越显严重。在今年奔驰车展网站制作触摸屏版本的时候就发生了播放器频繁出错退出的情况。排查了很久,初步确定是使用Robotlegs的viewMap.mapView()造成的问题,于是在GitHub上提交了任务单。
在接下来的三个月内,我一有时间就思考这个Bug的来源。仔细研究了Gaia和Robotlegs源代码,又借鉴了Robotlegs模块扩展和另一个基于Robotlegs的网站框架HandBones的模块化思想,终于完美解决了这个问题。
首先我先排查了Gaia框架自身的内存泄漏问题。通过Profiler的调试,我发现Page实例在卸载后仍然驻留在内存中。也就是说Gaia框架本身就存在内存泄漏的问题。仔细阅读Gaia的代码后,发现问题出在对loaderContext的处理上。Gaia框架很好的处理了卸载swf可能造成内存泄漏的问题,却唯独遗漏了这个小地方:loaderContext对象会持有对被加载内容的引用。由于Gaia框架卸载loader的内容后,并没有清空loaderContext,所以被加载内容也就没法被垃圾回收。问题找到了,解决方法就很简单。在卸载的同时设置loaderContext=null就可以了。我已经向Gaia论坛提交了这个Bug,并且得到了作者Steven Sacks的肯定回复。官方的修正版本应该不久就能出来了。














