2011-04-21 7 views
6

Actualmente estoy escribiendo una aplicación node.js/socket.io pero la pregunta es general a javascript.Administración de memoria de objetos Javascript cuando se usa eliminar en la propiedad

Tengo una matriz asociativa que almacena un color para cada conexión de cliente. Considere lo siguiente:

var clientColors = new Array(); 

//This execute each new connection 
socket.on('connection', function(client){ 
clientColors[client.sessionId] = "red"; 

    //This execute each time a client disconnect 
    client.on('disconnect', function() { 
     delete clientColors[client.sessionId]; 
    }); 
}); 

Si uso la instrucción de eliminación, me temo que va a hacer una pérdida de memoria como la propiedad nombre de client.sessionId valor (matrices asociativas son objetos) no se eliminarán, su referencia a su el valor será gonne pero la propiedad todavía existirá en el objeto.

¿Estoy en lo cierto?

+0

Esto se ve muy bien para mí. Eliminará la entrada clientColors de client.sessionId. – neebz

Respuesta

12

delete clientColors[client.sessionId];

Esto eliminará la referencia al objeto en objeto clientColors. El recolector de basura v8 recogerá los objetos con cero referencias para la recolección de basura.

Ahora, si ha preguntado si esto creó una pérdida de memoria en IE4, entonces esa es una pregunta diferente. v8 por otro lado puede manejar esto fácilmente.

Al eliminar la única referencia, la propiedad también desaparecerá. También tenga en cuenta que los objetos no son "matrices asociativas" en javascript ya que el pedido es específico de la implementación y no está garantizado por la especificación ES.

4

Dado que clientColors[client.sessionId] es un valor primitivo (una cadena) en este caso, se borrará inmediatamente.

Consideremos el caso más complicado de foo[bar] = o siendo o no primitivo (algún objeto). Es importante comprender que o no se almacena "dentro" de foo, sino en algún lugar de una ubicación de memoria arbitraria. foo simplemente tiene un puntero a esa ubicación. Cuando llama al delete foo[bar], ese puntero se borra, y le corresponde al recolector de basura liberar la memoria tomada por o.

BTW: No debe usar Array cuando desee una matriz asociativa. Este último se llama Object en Javascript y por lo general se instancia utilizando la taquigrafía cuasi-literal {}

-1

Si está utilizando el motor V8 o nodejs/io, puede no conducir a una fuga, pero siempre es recomendable para prevenir goteos.

apenas suprimirlo

delete clientColors[client.sessionId]; 

O establecen a NULL

clientColors[client.sessionId] = null; 

que también incluirá en cascada a todos los objetos heredados prototípica.

De esta manera, casi no hay probabilidad de iniciar una fuga.

+2

Supongo que quiere eliminar antes de asignar el elemento de matriz a nulo; de lo contrario, no está eliminando nada porque la referencia 'clientColors [client.sessionId]' será nula. ¿O estoy malinterpretando tu intención aquí? –

Cuestiones relacionadas