总之,就是存在强引用。
避免方法:
在不需要用到某个实例的时候,消除与其关联的强引用。比如,移除不再使用的监听器,不再使用的显示对象移除显示列表等。最保险的方法是每个类有自己的GC方法,当不用的时候对应的实例运行一下。
检查方法:
用flash/flex的IDE,运行profile模式,观察“活动对象”栏目,进行监控,反复的进行一些可疑的操作。如果累计实例和当前实例的数目相等或者很接近,并且内存使用情况的曲线明显上扬,那多半是有内存泄露问题了。profile不是非常的准确,虽然也有强制GC的按钮。使用System.totalMemory进行检测是最准确的方法,但是不能看到各个实例的内存使用情况。
多说几句:
Your objects will not be removed immediately when all active references are deleted.they will be removed at some indeterminate time in the future。
为了避免用户体现到播放器崩溃,可以检测System.totalMemory,出现异常跳转页面,记得保存好当前的游戏信息。
it is not counted in reference counting, and it is not followed for mark sweeping.This means that if the only references remaining to an object are weak, it will be available for collection on the next GC sweep.
officially unsupported,new LocalConnection().connect('foo');测试可以用LocalConnection,抛出异常会执行一次GC,产品里就不要有这些代码了。
stage.window.minimize();
stage.window.restore();通过最小化和恢复窗口,可以比较环保,强制GC,但是要想办法让整个过程不被用户发现。