Насколько мне известно, это не задокументировано.У меня есть ощущение, что GC не будет работать, пока выполняется ваш код (то есть, пока ваш код находится в стеке выполнения; каждый кадр проигрыватель создает новый стек для кода использования).Очевидно, это связано с наблюдением и моим собственным опытом с Flash, поэтому я бы не сказал, что это на 100% точно.Надеюсь, это обоснованное предположение.
Вот простой тест, который, кажется, показывает, что вышеупомянутое верно:
package {
import flash.display.Sprite;
import flash.net.FileReference;
import flash.system.System;
import flash.utils.Dictionary;
import flash.utils.setTimeout;
public class test extends Sprite
{
private var _dict:Dictionary = new Dictionary(true);
public function test()
{
testGC();
setTimeout(function():void {
traceCount();
},2000);
}
private function testGC():void {
var fileRef:FileReference;
for(var i:int = 0; i < 100; i++) {
fileRef = new FileReference();
_dict[fileRef] = true;
traceCount();
System.gc();
}
}
private function traceCount():void {
var count:int = 0;
for(var i:* in _dict) {
count++;
}
trace(count);
}
}
}
GC кажется особенно жадным, когда есть FileReference
объектоввовлечен (опять же, это из моего опыта; насколько я знаю, это не задокументировано).
Теперь, если вы запустите приведенный выше код, даже явно вызывая System.gc()
, объекты не будут собраны, покаваша функция находится в стеке: вы можете видеть, что они все еще живы, глядя на счетчик словаря (который по очевидным причинам настроен на использование слабых ссылок).
Когда этот счетчик отслеживается снова, вдругой стек выполнения (вызванный асинхронным вызовом setTimeout), все объекты были освобождены.
Итак, я бы сказал, что GC не является причиной плохой работы в вашем случае.Опять же, это просто наблюдение, и тот факт, что сборщик мусора не выполнялся во время выполнения пользовательского кода в этом тесте, не означает, что он никогда не будет работать.Скорее всего, этого не произойдет, но, поскольку это не задокументировано, я не боюсь знать наверняка.Надеюсь, это поможет.