memoria liberar leaks how collector javascript c++ v8

liberar - javascript memory leaks



¿Cómo libera un objeto envuelto de C++ cuando el objeto Javascript asociado es basura recogida en V8? (3)

En general, si un lenguaje recogido de basura puede contener referencias a recursos fuera del motor de lenguaje (archivos, sockets o en su caso objetos de C ++), debe proporcionar un método "cerrado" para liberar ese recurso lo antes posible, sin esperar hasta el GC piensa que vale la pena destruir tu objeto.

empeora si su objeto C ++ está hambriento de memoria y el objeto recolectado es solo una referencia: puede asignar miles de objetos, y el GC solo ve unos pocos KB de objetos pequeños, no lo suficiente para desencadenar la recopilación; mientras que el lado de C ++ está luchando con decenas de megabytes de objetos obsoletos.

La documentación de V8 explica cómo crear un objeto Javascript que envuelve un objeto C ++ . El objeto Javascript se aferra a un puntero a una instancia de objeto C ++. Mi pregunta es, supongamos que crea el objeto de C ++ en el montón, ¿cómo puede obtener una notificación cuando el objeto de JavaScript es recopilado por el gc, para que pueda liberar el objeto de C ++ asignado al montón?


Haz todo tu trabajo en algún ámbito cerrado (de objeto o función). Entonces puede eliminar de forma segura el objeto C ++ cuando salió del alcance. GC no comprueba los punteros en busca de objetos puntiagudos.


El truco consiste en crear un identificador Persistent (segundo punto de viñeta de la referencia de API vinculada: " Persistent identificadores Persistent no se retienen en una pila y se eliminan solo cuando los quita específicamente ... Utilice un identificador persistente cuando lo necesite mantener una referencia a un objeto para más de una llamada de función, o cuando los tiempos de vida del manejador no se corresponden con alcances de C ++. "), y llamar a MakeWeak() sobre él, pasando una función de devolución de llamada que hará la limpieza necesaria (" Un controlador persistente puede debilitarse, utilizando Persistent::MakeWeak , para desencadenar una devolución de llamada del recolector de elementos no utilizados cuando las únicas referencias a un objeto provienen de identificadores persistentes débiles. "- es decir, cuando todos los identificadores" normales "se salieron de alcance y cuando el recolector de basura está por eliminar el objeto).

La firma del método Persistent::MakeWeak es:

void MakeWeak(void* parameters, WeakReferenceCallback callback);

Donde WeakReferenceCallback se define como un puntero a función tomando dos parámetros:

typedef void (*WeakReferenceCallback)(Persistent<Object> object, void* parameter);

Estos se encuentran en el archivo de encabezado v8.h distribuido con V8 como la API pública.

MakeWeak que la función que pasa a MakeWeak limpie el parámetro de objeto Persistent<Object> que se le pasará cuando se llame como una devolución de llamada. El void* parameter parámetro void* parameter se puede ignorar (o el void* parameter puede apuntar a una estructura C ++ que contiene los objetos que necesitan limpieza):

void CleanupV8Point(Persistent<Object> object, void*) { // do whatever cleanup on object that you''re looking for object.destroyCppObjects(); } Parameter<ObjectTemplate> my_obj(ObjectTemplate::New()); // when the Javascript part of my_obj is about to be collected // we''ll have V8 call CleanupV8Point(my_obj) my_obj.MakeWeak(NULL, &CleanupV8Point);