垃圾回收指的是从内存中删除不再需要的对象的操作。此过程会释放不再被引用的实例所使用的内存。
Flash Player 在应用程序生命周期内会根据需要执行垃圾回收。但取消对对象的引用不会触发垃圾回收。因此,删除对某个对象的所有引用之后,垃圾收集器不一定会释放该对象所用的内存。此对象只是成为垃圾回收的候选对象。
单击“运行垃圾收集器”按钮并不能保证符合垃圾回收条件的所有对象都被作为垃圾回收。为新资源分配内存通常会触发垃圾回收。如果新资源需要的内存无法通过当前分配获得,垃圾收集器就会运行并释放标记为释放的内存。因此,即使您删除了对某个对象的所有引用,也可能不会立即将该对象作为垃圾回收,但在创建并使用其它实例时,则很可能会将该对象作为垃圾回收。可以在应用程序处于空闲状态时,观察其内存分配情况。即使存在标记为回收的对象,空闲应用程序的内存使用情况通常也不会改变,直到您开始与空闲应用程序交互。
Flash Player 以多字节块的方式分配内存,而不是一次分配一个字节。如果某个块的一部分标记为垃圾回收,而其它部分并未作此标记,则不会释放此块。垃圾收集器会尝试将内存块中所有未使用的部分组合为可以释放的较大的块,但并不是在垃圾收集器每次运行时都会做此尝试。
在记录内存快照之前,会进行隐式垃圾回收。也就是说,单击“制作内存快照”按钮这一操作与先单击“运行垃圾收集器”按钮再单击“制作内存快照”按钮的操作效果。
flash player并不是“无法彻底回收”。回收还是可以彻底回收的,只是回收的时间不由你决定,而是由Flash Player自身决定的。
事实上,一个Flash应用启动后,FP会先申请一大块内存,然后反复利用这块内存。这样是为了避免反复申请内存而降低性能。
用Deepa的话说:一个垃圾放在垃圾桶里时,你不会去倒垃圾桶。通常你只会在垃圾桶里的垃圾满了时,才会去倒垃圾。同样,如果有可回收的对象时,但FP申请的内存仍然够用的时候,FP就不会执行GC,就算你单击“运行垃圾收集器”,因为执行GC也会消耗性能