在Flash中释放内存的最佳方法是什么?它有垃圾收集器吗?如何调用GC?如何使对象适用于垃圾收集?
我有一个显示大量图表的网站。我观察到IE在显示这些图表时使用的内存继续增加,有时达到500 Mb左右。我总是将未使用的对象重新初始化为NULL。
答案 0 :(得分:3)
AS3有一个内置GC。可以说,关于它如何运作的最佳资源是Grant Skinner关于这个主题的文章:
http://www.gskinner.com/blog/archives/2006/06/as3_resource_ma.html
您可以使用Flex Profiler(仅限Flex Pro)来了解垃圾收集的工作原理。探查器显示当前在内存中的对象,并且可以选择在单击按钮时强制进行垃圾回收,从而更容易确定哪些对象在给定时间有资格进行垃圾回收。
答案 1 :(得分:3)
设置对象引用NULL并不总是足够的。如果您创建了引用该对象的任何事件侦听器(或者该对象本身已注册为侦听器),那么它仍会在某处被引用。
避免像侦听器这样的问题的一种方法是使用弱引用。 addEventListener接受一个可选参数,让您告诉它使用弱引用。这将允许对象被垃圾收集,如果除了弱引用的事件监听器(或其他弱引用)之外没有引用它。
答案 2 :(得分:1)
在许多情况下,您可以从堆中释放Flex对象,但Flash VM不会将内存返回给操作系统。因此,您必须编写内存“plateu”。
http://www.craftymind.com/2008/04/09/kick-starting-the-garbage-collector-in-actionscript-3-with-air/
答案 3 :(得分:0)
我可以给你的一个技巧是删除不再需要的事件监听器 - 例如,如果你正在调用WebService来检索一些静态数据,并使用ResultEvent监听器,一旦处理完事件监听器,就调用removeEventListener释放它正在使用的内存。还有许多其他提示用于处理内存使用。