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 ;) .