2011-08-18 18 views
7

Tengo una página web que inicia una secuencia de comandos HTML5 SharedWorker. El uso de la memoria de Chrome aumenta cada vez que esta página se vuelve a cargar (presionando F5).Fuga de memoria en Chrome con Shared Worker?

El script de trabajo es muy simple. Cada segundo (usando setInterval) se envía un mensaje al puerto conectado.

Parece que el proceso de trabajo finaliza y se reinicia cada vez que presiono F5. Esto es lo que esperaría, ya que el trabajador no está realmente compartido por más de un 'documento'. Sin embargo, no puedo entender por qué el uso de memoria aumenta en cada actualización.

¿Alguien sabe por qué sucede esto?

Dado que la memoria aumenta cada vez que se vuelve a cargar la página, me hace pensar que no puedo utilizar los trabajadores compartidos en absoluto en Chrome. ¿Alguien ha podido hacerlo sin tener problemas de memoria?

ACTUALIZACIÓN

Este es el código HTML de alojamiento:

<div id="output"></div> 
<script type="text/javascript" src="/scripts/jquery-1.4.4.js"></script> 
<script type="text/javascript"> 
$(function() { 
    var worker = new SharedWorker("/scripts/worker.js") 

    worker.port.onmessage = function(e) { 
     $("#output").append($("<div></div>").text(e.data)); 
    }; 

    worker.port.start(); 
}); 
</script> 

... y esto es worker.js:

var list = []; 

setInterval(function() { 
    for (var i = 0; i < list.length; ++i) { 
     list[i].postMessage("#connections = " + list.length); 
    } 
}, 1000); 

onconnect = function (event) { 
    list.push(event.ports[0]); 
}; 

La página de alojamiento comienza/se conecta a un trabajador común y saca todo lo que se recibe de él.

El código de trabajador mantiene una lista de puertos conectados y les envía un mensaje una vez por segundo.

Esto es cosas simples. Sin embargo, cada vez que la página de alojamiento se recarga en Chrome. La carga útil de la memoria para esa pestaña aumenta.

A continuación se muestra el uso de memoria de Chrome después de un par de actualizaciones:

After refreshing a couple of times I've reached 100 MB

... después de actualizar un poco más estoy llegando a 250 MB ...

Reaching 250 MB after some more refreshing

Me estoy quedando sin ideas, pensando que esto debe ser un error en Chrome. ¿Alguien puede darme algún tipo de puntero?

ACTUALIZACIÓN 2

Desactivación de mi extensión AdBlock parecía solucionar el problema:

Running without AdBlock

así que estaba contento por un rato, pero resultó que recuerdo aún está siendo filtrada. Con AdBlock desactivado, solo pierde un poco menos por actualización de página.

+0

Si ejecuta Chrome con el indicador '--purge-memory-button', abra el Administrador de tareas de Chrome y haga clic en el botón Purgar memoria, ¿la memoria de su extensión vuelve a su nivel inicial o todavía parece hinchada? –

+0

@Chris Todavía está hinchado. Es la memoria de la página de alojamiento que está hinchada. El hilo de fondo (extensión) no está hinchado, se reinicia (desaparece y vuelve a aparecer en el administrador de tareas) en cada actualización. –

Respuesta

1

Parece que el equipo de Chromium ha resuelto este problema. No puedo reproducirlo más.

-3

Primero Asigne un nombre a su SetInterval myInterval = setInterval ("change()", 1000);

Luego, el PageExit o Deja etc

clearInterval (myInterval); o se unen en algún otro evento parada ...

Ejemplo:

<script language="JavaScript"> 

/* Image Preloading */ 
a = new Image();a.src = "screw.jpg"; 
b = new Image(); b.src = "washer.jpg"; 
c = new Image(); c.src = "capnut.jpg"; 
d = new Image(); d.src = "coffee.gif"; 
//end image preloading 

pix = new Array("screw.jpg","washer.jpg","capnut.jpg","coffee.gif"); 

var i = 0; 
var counter = 1; 

function slideshow(){ 
ImgPreload = setInterval("change()", 1000); 
} 

function change(){ 
    document.images.pic.src = pix[i]; 
    i = i + 1; 
    if (i > (pix.length - 1)) {i = 0; counter = counter + 1;} 
    if (counter > 2) {clearInterval(ImgPreload);} 
} 
</script> 

Si bien esto no es específicamente lo que está haciendo es un buen recurso para una circunstancia similar. Sin, el clearInterval y un disparador sus usos de memoria se almacena en caché de forma automática como una base para webkit ... que está tratando de ayudarle mediante la carga de las cargas pertinentes de esa secuencia de comandos como elementos de caché o algo ...

:)

+0

Gracias, pero el intervalo se está ejecutando en el trabajador. Por lo tanto, no puedo acceder desde la página de alojamiento. Además, dado que el trabajador finaliza y se reinicia al refrescar su intervalo (debe) terminar también implícitamente. –