2011-08-18 14 views
7

私はHTML5 SharedWorkerスクリプトを開始するWebページを持っています。このページがリロードされるたびに(F5を押す)、Chromeのメモリ使用量が増加します。共有ワーカーを使用したChromeでのメモリリーク?

ワーカースクリプトは非常に簡単です。毎秒(setIntervalを使用)、接続されたポートにメッセージが送信されます。

F5を押すたびに、ワーカープロセスが終了して再開されるようです。これは、実際には複数の「文書」によってワーカーが共有されているわけではないので、私が期待していることです。しかし、リフレッシュするたびにメモリ使用量が増加する理由はわかりません。

これはなぜ起こっているのですか?

ページがリロードされるたびにメモリが増えると、私はChromeで共有ワーカーを使用することはできません。誰もがメモリの問題を抱えずにそうすることができましたか?

UPDATE

これはホスティングHTMLです:

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

...これは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]); 
}; 

ホスティングページが開始/共有作業者に接続し、それから受信したものを出力します。

ワーカーコードは、接続されたポートの一覧を保持し、1秒に1回メッセージを送信します。

これは簡単なものです。それでも、Chromeでホスティングページがリロードされるたびにそのタブのメモリペイロードが増加します。

以下はリフレッシュのカップルの後にChromeのメモリ使用量を示しています

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

...いくつかのより多くの私は250メガバイトに達しています...

Reaching 250 MB after some more refreshing

を更新した後、私はアイデアがなくて、これはChromeのバグでなければならないと考えています。誰かが私に何らかのポインタを与えることができますか?私のAdBlockを拡張を無効に

UPDATE 2

は、問題を解決するように見えた:

Running without AdBlock

だから私はしばらくのために幸せでしたが、それはメモリがまだリークされていることが判明しました。 AdBlockを無効にすると、1ページあたりの更新頻度がかなり低下します。

+0

Chromeで '--purge-memory-button'フラグを指定してChromeのタスクマネージャを開き、[メモリを消去]ボタンをクリックした場合、拡張機能のメモリは初期レベルに戻っていますか? –

+0

@Chrisまだ肥満です。それは肥大化しているホスティングページのメモリです。バックグラウンドスレッド(拡張)は肥大化されず、すべてのリフレッシュ時に再開されます(タスクマネージャで消えて再び表示されます)。 –

答えて

1

Chromiumチームがこの問題を解決したようです。私はもうそれを再現することはできません。

-3

最初にあなたのSetIntervalに名前をつけてください。 myInterval = setInterval( "change()"、1000);そして

PageExit上又は

てclearInterval(myInterval)等を残します。これは特に、あなたがそれをやっているものではありません似たような状況のための優れたリソースですが

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

:または...他のいくつかの停止イベントに

例をバインドします。 ClearIntervalとメモリ使用量をトリガーするトリガーは、Webkitの基本として自動的にキャッシュされます。キャッシュ要素または何かとしてスクリプトから適切な負荷をロードすることによって、あなたを助けようとしています...

:)

+0

ありがとうございますが、間隔がワーカーで実行されています。したがって、私はホスティングページからアクセスできません。また、作業者は、その間隔をリフレッシュするときに終了して再起動するので(暗黙的にも終了する必要があります) –