2011-08-30 12 views
17

var Obj = function(){}; var X = new Obj();¿Cómo se borra la memoria en Javascript?

X = null ¿borrar la memoria correctamente?

¿Esto también sería equivalente?

var Obj = function(){}; 
var X = {}; 
X.obj = new Obj(); 
delete(X.obj); 

EDITAR Parecería que a pesar de la supresión de X.obj sería no inmediatamente borrado de la memoria, que ayudaría a la recolección de basura. Si no elimino X.obj, todavía habrá un puntero a un objeto y, por lo tanto, es posible que el GC no lo limpie.

Aunque estoy recogiendo @ respuesta de delnan, si estás leyendo esto, usted debe def también coger el artículo de Benubird.

también me doy cuenta que accidentalmente escrito de eliminación (X) originalmente en lugar de borrar (X.obj) - lo siento.

+0

Debe explicar por qué está interesado en "memoria borrada". ¿Es para reducir el uso de RAM? ¿O por seguridad? O alguna otra razón? –

+0

Para reducir el uso de RAM/asegúrese de que el GC lo golpee –

+0

Me gusta esta pregunta. Desafortunadamente, como con la mayoría de los entornos administrados por memoria, el mejor enfoque es dejar que el GC haga su trabajo. Ah, y observa aferrándose a las referencias. –

Respuesta

15

La respuesta corta es que no lo hace. delete simplemente elimina una referencia (y no en la forma en que intentas usarla, mira el enlace de arriba - delete es una de esas características de lenguaje que pocas personas realmente entienden), nada más. La implementación borra la memoria para usted, pero no es asunto suyo (e incluso si, estrictamente hablando, esta es la razón por la que uno no debe confiar en los finalizadores en los lenguajes de GC que los ofrecen) sí lo hace. Sin embargo, tenga en cuenta:

  • Solo se pueden eliminar los objetos que se puede probar que son inalcanzables (es decir, no hay forma de acceder a ellos) a todos los códigos. Lo que mantiene referencias a quién es generalmente bastante obvio, al menos conceptualmente. Solo debes tener cuidado cuando lidies con muchos cierres, ya que pueden capturar más variables de lo que piensas. También tenga en cuenta que las referencias circulares son limpiadas adecuadamente.
  • Hay un error en las viejas (pero lamentablemente todavía utilizadas) versiones de IE que implican la recolección de basura de los controladores de eventos JS y los elementos DOM. Google (tal vez incluso SO) debería tener mejor material en mi memoria.

En el lado positivo, eso significa que no obtendrá errores de puntero colgando o (salvo por supuesto las trampas antes mencionadas) pérdidas de memoria.

+0

Por lo tanto, en el ejemplo de código anterior, wouldn ' t el nuevo Obj() se elimina de la memoria a través de la recolección de basura, ya que nada lo señala más? –

+0

Después del primer fragmento, el objeto creado ya no se referencia y, por lo tanto, se puede recopilar. El segundo mal usa 'delete' (vea el enlace de Benubird) y el resultado depende de si la implementación le permite borrar variables, pero si lo hace, no hay referencia restante. De lo contrario, los objetos pueden convertirse en basura recolectada tan pronto como 'X' se salga del alcance. De cualquier manera, la memoria se libera * en algún momento * después (NO de inmediato, a menos que sea por una posibilidad increíble) después de que el objeto ya no se puede alcanzar. – delnan

+0

Me acabo de dar cuenta de que hice un error tipográfico en mi fragmento. Me refiero a eliminar (X.obj). Entonces, ¿debería eliminar (X.obj) o X.obj = null para acelerar el GC? –

3

No - Javascript ejecuta GC cuando se siente así.

13
+0

Gracias por este. – ZenMaster

+1

+1 gran artículo –

+0

Si bien este enlace puede responder a la pregunta, es mejor incluir las partes esenciales de la respuesta aquí y proporcionar el enlace de referencia. Las respuestas de solo enlace pueden dejar de ser válidas si la página vinculada cambia. – Mistalis

2

El método Eliminar solo borra la referencia, no el objeto. Cualquier otra referencia se dejará abierta esperando al recolector de basura.

JavaScript tiene su propia GC, y se ejecutará en todo y limpiar las cosas cuando nada se refiere a ellos nunca más.

Todavía creo que es una buena práctica anular objetos. Eliminar un objeto también ayuda al GC porque verá algo colgando y decir "Te voy a comer porque estás solo (y ahora con una risa cínica)".

Usted debe mirar Deleting Objects in JavaScript

pesar de que hay un GC, todavía quiere asegurarse de que su escritura está optimizado para un rendimiento como los ordenadores de la gente, navegadores y barras de herramientas fricken (y el número de ellos), variará.

0

La memoria de JavaScript generalmente se maneja de manera similar a Java - Quiero decir que hay (o debería haber) un recolector de basura que eliminaría el objeto si no hay referencias a él. Así que sí, simplemente "anular" la referencia es la única forma en que debe "manejar" la liberación de memoria, y la liberación real es la parte del host JS.

1

En términos generales, la gestión de memoria en Javascript es específica del agente de usuario. Los conceptos básicos del recolector de basura son a través del recuento de referencias. Por lo tanto, al establecer una referencia a nulo (usando la palabra clave delete o por asignación explícita), puede asegurarse de que se borre una referencia, SI el objeto no tiene referencias que vivirán fuera de su alcance de creación. Siendo ese el caso, el GC ya habrá limpiado cualquier objeto o variable cuyo alcance haya finalizado sin que lo establezca explícitamente como nulo.

Sin embargo, hay que encargarse de algunas cosas: las referencias circulares son fáciles de crear en JS, especialmente entre un elemento DOM y un objeto. Se debe tener cuidado para borrar (o no crear en primer lugar) las referencias ay/o de los elementos DOM dentro de los objetos. Si crea una referencia a/desde relacionada con DOM, asegúrese de limpiarlos explícitamente estableciendo las referencias a nulo, tanto en su objeto como en el elemento DOM. Simplemente establecer un objeto primario como nulo no es suficiente si hay objetos secundarios con referencias a/desde DOM o localStorage porque esas referencias continuarán activas, y si hubo alguna referencia del niño al padre, entonces el padre vivirá en memoria debido a esa referencia.

Las páginas web pueden, de hecho, tener pérdidas de memoria en su memoria. Después de navegar, las referencias circulares mantienen los objetos y los elementos DOM en la memoria hasta que haya reiniciado el navegador.

Un artículo sobre el tema: http://docstore.mik.ua/orelly/webprog/jscript/ch11_03.htm, y otra mirada detallada: http://blogs.msdn.com/b/ericlippert/archive/2003/09/17/53038.aspx

Cuestiones relacionadas