Recientemente, encontré una de mis aplicaciones que consume demasiada memoria y aumenta en 10 MB / seg.
Entonces, me gusta saber la mejor manera de destruir objetos y variables de JavaScript para que el consumo de memoria permanezca bajo y mi FF no se pueda destruir.
Estoy llamando a dos de mi JavaScript en cada intervalo de 8 segundos sin volver a cargar la página.
function refresh() {
$('#table_info').remove();
$('#table').hide();
if (refreshTimer) {
clearTimeout(refreshTimer);
refreshTimer = null ;
}
document.getElementById('refresh_topology').disabled=true;
$('<div id="preload_xml"></div>').html('<img src="pic/dataload.gif" alt="loading data" /><h3>Loading Data...</h3>').prependTo($("#td_123"));
$("#topo").hide();
$('#root').remove();
show_topology();
}
¿Cómo puedo ver qué variable causa la sobrecarga de memoria y el método para detener la ejecución de ese proceso?
javascript
object
destroy
Amit Shah
fuente
fuente
obj = null
?show_topology
? --- B) ¿Alguna vez está limpiando las cosas que agrega#td_123
? --- C) ¿Hay una versión en vivo de esto en alguna parte?Respuestas:
Puede poner todo su código en un espacio de nombres como este:
var namespace = {}; namespace.someClassObj = {}; delete namespace.someClassObj;
El uso de la
delete
palabra clave eliminará la referencia a la propiedad, pero en el nivel bajo, el recolector de basura (GC) de JavaScript obtendrá más información sobre qué objetos se recuperarán.También puede usar las herramientas de desarrollo de Chrome para obtener un perfil de memoria de su aplicación y qué objetos de su aplicación deben reducirse.
fuente
No se pueden eliminar objetos, se eliminan cuando no hay más referencias a ellos. Puede eliminar referencias con
delete
.Sin embargo, si ha creado referencias circulares en sus objetos, es posible que deba desacoplar algunas cosas.
fuente
Si bien las respuestas existentes han dado soluciones para resolver el problema y la segunda mitad de la pregunta, no brindan una respuesta al aspecto de autodescubrimiento de la primera mitad de la pregunta que está en negrita:
Puede que no fuera tan sólido hace 3 años, pero la sección " Perfiles " de las herramientas de desarrollo de Chrome ahora es bastante poderosa y rica en funciones. El equipo de Chrome tiene un artículo perspicaz sobre su uso y, por lo tanto, también sobre cómo funciona la recolección de basura (GC) en javascript, que es el núcleo de esta pregunta.
Dado que
delete
es básicamente la raíz de la respuesta actualmente aceptada por Yochai Akoka, es importante recordar lo que hace la eliminación. Es irrelevante si no se combina con los conceptos de cómo funciona GC en las siguientes dos respuestas: si hay una referencia existente a un objeto, no se limpia. Las respuestas son más correctas, pero probablemente no tan apreciadas porque requieren más reflexión que simplemente escribir 'eliminar'. Sí, una posible solución puede ser usardelete
, pero no importará si hay otra referencia a la pérdida de memoria.Otra respuesta menciona apropiadamente referencias circulares y la documentación del equipo de Chrome puede proporcionar mucha más claridad, así como las herramientas para verificar la causa.
Como
delete
se mencionó aquí, también puede ser útil proporcionar el recurso Understanding Delete . Aunque no entra en ninguna de las soluciones reales que están realmente relacionadas con el recolector de basura de JavaScript.fuente
Estructura tu código para que todos tus objetos temporales estén ubicados dentro de cierres en lugar de espacios de nombres globales / propiedades de objetos globales y salgan del alcance cuando hayas terminado con ellos. GC se encargará del resto.
fuente
Me enfrentaba a un problema como este y tenía la idea de simplemente cambiar el HTML interno de los hijos del objeto problemático.
adiv.innerHTML = "<div...> the original html that js uses </div>";
Parece sucio, pero me salvó la vida, ¡ya que funciona!
fuente