Foros del Web » Programando para Internet » Javascript »

Gasto de memoria: Garbage Collector y borrado manual

Estas en el tema de Gasto de memoria: Garbage Collector y borrado manual en el foro de Javascript en Foros del Web. IMPORTANTE para quien no quiera leer el tostón: ¿Alguien conoce un mecanismo para eliminar elementos del DOM que quedan residuales en memoria? Gracias ;) . ...
  #1 (permalink)  
Antiguo 15/02/2008, 10:49
Avatar de Negora  
Fecha de Ingreso: agosto-2003
Mensajes: 122
Antigüedad: 20 años, 8 meses
Puntos: 5
Gasto de memoria: Garbage Collector y borrado manual

IMPORTANTE para quien no quiera leer el tostón: ¿Alguien conoce un mecanismo para eliminar elementos del DOM que quedan residuales en memoria? Gracias ;) .


Hola gente:

Programando, esta semana he llegado a un punto crítico que me está volviendo realmente loco. Como ya se sabe, JavaScript (o ECMAScript más concretamente), tiene una forma de tratar las funciones de una manera muy distinta a otros lenguajes de programación (como objetos), lo que junto a su particular "scope" (alcance de las variables) y forma de declarar nuevos objetos, puede crear complicaciones cuando uno se mete a desarrollar aplicaciones complejas.

Esta manera de funcionar provoca que entre JavaScript y los elementos de la página (DOM), de forma muchas veces "accidental" para nosotros, se creen referencias cruzadas entre unos y otros que impiden que el Garbage Collector de una de las 2 partes (JavaScript ó DOM) elimine correctamente de la memoria cierto elemento, quedando ahí retenido, en ocasiones incluso habiendo cerrado la página o la ventana (caso del IE).

Existen una serie de casos tipo que podéis leer aquí: Artículo muy interesante .

Pues bien, tras devanarme la cabeza sobre la posibilidad de evitar dichos casos y adaptar mis librerías (que no son pocas), he llegado a un punto en el que considero que es imposible evitarlos al 100%, especialmente por simplicidad del código y, en otros casos, por pura necesidad. ¿Cómo demonios impedir usar funciones anónimas que pertenezcan a su vez a otras funciones? Uf, tras tantos años haciendo eso es que me cuesta mucho quitármelo de la cabeza y buscar alternativas...

Por eso, he estado preguntándome y buscando información sobre la posibilidad de llamar al Garbage Controller de forma manual, como se puede hacer en lenguajes de alto nivel. No he encontrado nada al respecto que me sirva. Teniendo en cuenta que JS es mucho más "peligroso" por su naturaleza para poder causar esos consumos de memoria me sorprendería que no se haya implementado nada semejante.

He probado mediante la orden "delete", que en JavaScript cumple su cometido para eliminar de memoria variables, pero evidentemente no hace efecto en objetos del DOM. ¿Alguien conoce algo semejante?

También quisiera aclarar que existe la creencia de que empleando el método "removeChild" o asignando la propiedad "innerHTML" a un texto en blanco se elimina el contenido de una página al 100%, pero no es así. Sólo se retiran los nodos del DOM, pero siguen en memoria.

Por si sirve de ayuda para entender el problema, expongo mi ejemplo... En una tabla cargo filas con datos. Dependiendo de las peticiones del usuario, de forma dinámica, esas filas se eliminan y se añaden otras con nueva información. Basta con imaginar una búsqueda y listado de películas.

Pues bien, las filas que elimino, dado que JavaScript tiene algún tipo de interacción con ellas en mi código, aun siendo quitadas del DOM, permanecen en memoria. Esto no es problema en una página común, ya que el consumo de memoria es mínimo, pero supongamos que se trata de una pantalla que se usa durante horas sin refrescar... Entonces el consumo se puede disparar hasta colapsar el navegador (supongo que el sistema operativo está protegido, pero nunca se sabe).

En definitiva, que necesito conocer si existe alguna manera humana de eliminar de la memoria objetos del DOM que han quedado ahí porque el Garbage Controller no es capaz de determinar si son prescindibles o no, ya sea porque yo los he referenciado en algún momento (cosa que he tratado de evitar) o porque existe alguna vinculación interna que desconozco.

Muchas gracias por vuestros comentarios y disculpad el tostón ;) .

Última edición por Negora; 15/02/2008 a las 11:01
  #2 (permalink)  
Antiguo 15/02/2008, 14:14
Avatar de Panino5001
Me alejo de Omelas
 
Fecha de Ingreso: mayo-2004
Ubicación: -34.637167,-58.462984
Mensajes: 5.148
Antigüedad: 20 años
Puntos: 834
Re: Gasto de memoria: Garbage Collector y borrado manual

No se puede llamar manualmente, pero podemos cambiar algunas cosas en nuestra manera de programar para evitar el problema. Dos artículos me ayudaron a entender el tema y ver alternativas:
1)http://www.bazon.net/mishoo/articles.epl?art_id=824
2)http://ajaxcookbook.org/event-handling-memory-leaks/
  #3 (permalink)  
Antiguo 16/02/2008, 04:54
Avatar de Negora  
Fecha de Ingreso: agosto-2003
Mensajes: 122
Antigüedad: 20 años, 8 meses
Puntos: 5
Re: Gasto de memoria: Garbage Collector y borrado manual

Panino: Holaaaaa. Antes de nada, muchas gracias por los enlaces que indicas. La pena es que es a lo que no quería tener que recurrir, je je je.

En la "biblia" que he escrito comentaba eso, que el framework personal que llevo desarrollando, por desgracia, incurre en bastantes de esos "fallos" de planteamiento y es bastante sensible a caer en los famosos "memory leaks".

En mi caso, aunque al comienzo me costó un poco, he conseguido aprender un poco por encima acerca de los "closures" y otras causas que provocan el mal funcionamiento del Garbage Controller. Pero claro, ponerme a cambiar todo a estas alturas me resulta complicado...

Viendo que no me va a quedar otra que rehacer mi mentalidad a la hora de programar en JS, he decidido posponer el cambio hasta que al menos tenga controlados unos proyectos en los que ando ahora. Entonces, me decidiré por repasar mis librerías una a una y cambiar todo lo que vea susceptible de caer en ese problema.

En cualquier caso, muchas gracias por tu respuesta Panino. De todos modos, si te enteras de alguna nueva característica que permita algo semejante, acuérdate de este hilo y nos lo comentas, ja ja ja. Un saludo ;) .
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 01:42.