2011-08-18 8 views
7

Ho una pagina Web che avvia uno script HTML5 SharedWorker. L'utilizzo della memoria Chrome aumenta ogni volta che questa pagina viene ricaricata (premendo F5).Perdita di memoria in Chrome usando Shared Worker?

Lo script di lavoro è molto semplice. Ogni secondo (utilizzando setInterval) viene inviato un messaggio alla porta connessa.

Sembra che il processo di lavoro sia terminato e riavviato ogni volta che si preme F5. Questo è quello che mi aspetterei poiché il lavoratore non è effettivamente condiviso da più di un "documento". Tuttavia, non riesco a capire perché l'utilizzo della memoria aumenta ad ogni aggiornamento.

Qualcuno sa perché questo sta accadendo?

Dato che la memoria aumenta ogni volta che la pagina viene ricaricata, mi viene in mente che non posso utilizzare affatto i lavoratori condivisi in Chrome. Qualcuno è stato in grado di farlo senza problemi di memoria?

UPDATE

Questo è il codice HTML di hosting:

<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> 

... e questo è 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 pagina di hosting inizia/si collega ad un lavoratore condiviso e emette ciò che viene ricevuto da esso.

Il codice worker mantiene un elenco di porte connesse e invia un messaggio a tutti una volta al secondo.

Questa è roba semplice. Eppure, ogni volta che la pagina di hosting viene ricaricata in Chrome. Il carico utile della memoria per quella scheda è aumentato.

Il seguente mostra l'utilizzo della memoria di Chrome dopo un paio di rinfresca:

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

... dopo aver aggiornato un po 'Sto raggiungendo 250 MB ...

Reaching 250 MB after some more refreshing

Sto esaurendo le idee, pensando che questo deve essere un bug in Chrome. Qualcuno può darmi una sorta di puntatore?

UPDATE 2

Disabilitare la mia estensione AdBlock sembrava per risolvere il problema:

Running without AdBlock

quindi ero felice per un po ', ma si è scoperto che la memoria è ancora in fase trapelato. Con AdBlock disabilitato sta perdendo un po 'meno per pagina di aggiornamento.

+0

Se si avvia Chrome con il flag '--purge-memory-button', quindi si apre il Task Manager di Chrome e si fa clic sul pulsante Purge Memory, la memoria dell'estensione torna al suo livello iniziale o sembra ancora gonfio? –

+0

@Chris È ancora gonfio. La memoria della pagina di hosting è gonfia. Il thread in background (estensione) non è gonfio, viene riavviato (scompare e riappare nel task manager) ad ogni aggiornamento. –

risposta

1

Sembra che il team Chromium abbia risolto questo problema. Non riesco più a riprodurlo.

-3

Prima assegnare un nome al setInterval myInterval = setInterval ("change()", 1000);

Poi PageExit o Lasciare ecc

clearInterval (myInterval); o si legano in qualche altro evento di arresto ...

Esempio:

<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> 

Anche se questo non è specificamente quello che stai facendo è una buona risorsa per una circostanza simile. Senza, il clearInterval e un trigger vostri usi della memoria cache viene automaticamente come base per webkit ... sta cercando di aiutare a caricando carichi rilevanti fuori lo script come elementi di cache o qualcosa del genere ...

:)

+0

Grazie, ma l'intervallo è in esecuzione nel lavoratore. Pertanto non posso accedervi dalla pagina di hosting. Inoltre, poiché il worker è terminato e riavviato quando si aggiorna il suo intervallo (dovrebbe essere) terminato implicitamente. –