2011-03-27 12 views
7

Tengo un programa que usa Javascript como un enlace de lenguaje de scripting a una aplicación C++ más grande. Uso V8 y Webkit de forma intercambiable, pero el tiempo de ejecución subyacente no debería importar para esta pregunta.Reglas de cierre de recolección de basura con Javascript

En esta aplicación, he creado dinámicamente objetos que recibirán devoluciones de llamada. Voy a crear esta unión como esta devolución de llamada ...

function f() { 
    var obj = CreateNewCallbackObj(); 
    obj.onCallback = dowork; // dowork is a function 
} 

Es evidente que esto tendrá problemas porque GC obj ha ido fuera de alcance y se eliminará con el tiempo.

Lo que quiero es que el objeto administre por sí mismo su duración. El objeto eventualmente recibirá una devolución de llamada que señalará el final de su vida, y cuando eso suceda, puede eliminarse.

Una idea es autorreferencia agregando un obj.myself = obj. Parece una forma incorrecta de hacerlo, pero podría funcionar a menos que un algoritmo de recolección de basura sea inteligente.

¿Hay una forma correcta de hacerlo? No existe un DOM subyacente persistente creado para almacenar objetos, todos los objetos JS se asignan dinámicamente según sea necesario, pero necesitan cierta forma de mantenerse dentro del motor JS.

Respuesta

7

Las autorreferencias serán no garantizan que algo permanezca con vida. De hecho, no se trata de una implementación que se respete a sí misma de un lenguaje GC (del que soy consciente) que utiliza refcounting solo. Ni siquiera pienses en abusar del algoritmo GC, o cualquier otro detalle definido por la implementación, de esa manera se encuentra la locura.

En cuanto a las alternativas: crea un objeto siempre accesible (por ejemplo, global) que contenga todos estos objetos (y así los mantenga vivos) y proporciona un método para eliminar un objeto. Luego ore para que nadie más tenga una referencia, o mejor aún, no se preocupe por esto. El objetivo de GC es que no debe (debe) saber/preocuparse cuando se libera la memoria.

También podría agregar una propiedad alive, comprobar que al inicio de todos los métodos y generar un error si se invoca un método al !this.alive - eso no es garantía, por supuesto, pero puede ayudar a la depuración.

Cuestiones relacionadas