Aquí hay una página muerta que pierde memoria en IE8 usando jQuery (detecto pérdidas de memoria al ver el uso de memoria de mi proceso iexplore.exe crecer con el tiempo en el Administrador de tareas de Windows):jQuery pérdida de memoria con DOM eliminación
<html>
<head>
<title>Test Page</title>
<script type="text/javascript" src="jquery.js"></script>
</head>
<body>
<script type="text/javascript">
function resetContent() {
$("#content div").remove();
for(var i=0; i<10000; i++) {
$("#content").append("<div>Hello World!</div>");
}
setTimeout(resetTable, 2000);
}
$(resetContent);
</script>
<div id="content"></div>
</body>
</html>
Al parecer, incluso cuando llamo a la función jQuery.remove()
, sigo experimentando algunas pérdidas de memoria. Puedo escribir mi propia función Remove que no experimenta ninguna pérdida de memoria de la siguiente manera:
$.fn.removeWithoutLeaking = function() {
this.each(function(i,e){
if(e.parentNode)
e.parentNode.removeChild(e);
});
};
Esto funciona muy bien y no se escape ninguna memoria. Entonces, ¿por qué jQuery pierde memoria? He creado otra función Remove basado en jQuery.remove()
y esto en verdad causa una fuga:
$.fn.removeWithLeakage = function() {
this.each(function(i,e) {
$("*", e).add([e]).each(function(){
$.event.remove(this);
$.removeData(this);
});
if (e.parentNode)
e.parentNode.removeChild(e);
});
};
Curiosamente, la pérdida de memoria parece ser causada por la cada llamada que jQuery incluye para evitar pérdidas de memoria de eventos y datos asociados con el Elementos DOM borrados. Cuando llamo a la función removeWithoutLeaking
, mi memoria se mantiene constante a lo largo del tiempo, pero cuando llamo a removeWithLeakage
, esta sigue creciendo.
Mi pregunta es, ¿qué hay de que cada llamada
$("*", e).add([e]).each(function(){
$.event.remove(this);
$.removeData(this);
});
podría ser la causa de la pérdida de memoria?
EDIT: typo fijo en código que, tras la repetición de pruebas, ha demostrado no tener ningún efecto sobre los resultados.
hacer otras modificaciones: He presentado un informe de error con el proyecto jQuery, ya que esto parece ser un error jQuery: http://dev.jquery.com/ticket/5285
Es una buena pregunta y felicitaciones por encontrar esto si realmente es un error. Sin embargo, es posible que obtengas una mejor respuesta de los chicos de jQuery, te sugiero que comiences una entrada con ellos si estás seguro. http://dev.jquery.com/ – womp
Interesante. No puedo ver inmediatamente ninguno de los sospechosos habituales de fuga de memoria de IE donde se obtiene un bucle de referencia entre un objeto de host y un objeto nativo, ¿quizás se trata de un nuevo tipo de fuga? ¿Sabes si ocurre solo en IE8 Standards Mode, o en IE7-compatibility mode, o Quirks, o los tres? – bobince
@Eli - ¿debo publicar la fuente para cada() al final de la pregunta? –