Que yo sepa, esto no está documentado. Tengo la sensación de que el GC no se ejecutará mientras se está ejecutando el código (es decir, mientras el código está en la pila de ejecución, cada fotograma, el jugador crea una nueva pila para el código de uso). Obviamente, esto proviene de la observación y mi propia experiencia con Flash, así que no diría que esto es 100% exacto. Con suerte, es una suposición educada.
Aquí está una prueba simple que parece demostrar que lo anterior es cierto:
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);
}
}
}
La GC parece ser particularmente codicioso cuando hay FileReference
objetos involucrados (de nuevo, esto es desde mi experiencia, esto no es' t documentado por lo que yo sé).
Ahora, si ejecuta el código anterior, incluso si llama explícitamente System.gc()
, los objetos no se recopilan mientras su función está en la pila: puede ver que todavía están vivos mirando el recuento del diccionario (que se establece usar referencias débiles por razones obvias).
Cuando se vuelve a rastrear este recuento, en una pila de ejecución diferente (causada por la llamada asincrónica a setTimeout), todos los objetos se han liberado.
Por lo tanto, diría que parece que el GC no es el culpable del bajo rendimiento en su caso. De nuevo, esto es una mera observación y el hecho de que el GC no se ejecutó mientras se ejecutaba el código de usuario en esta prueba no significa que nunca lo hará. Probablemente, no lo hará, pero dado que esto no está documentado, no hay forma de saberlo con certeza, me temo. Espero que esto ayude.
querida Orion, GC no lo salvará de pérdidas de memoria, por lo que preferiría consejos para utilizar un generador de perfiles, p. Flash Builder Profiler para reescribir su bloque de código lento para codeblock más rápido, porque tendrá diferentes usuarios de su aplicación, y se deben notar como mínimo para el uso de memoria dura de su aplicación en su lugar. – Eugene
gracias por el comentario, Eugene. mi pregunta no se trata de pérdidas de memoria, se trata de tratar de eliminar el GC como una posible causa de un problema particular de rendimiento que estoy teniendo. –