使用共享工作者的Chrome中的内存泄漏?

时间:2011-08-18 21:29:01

标签: html5 google-chrome memory-leaks web-worker

我有一个启动HTML5 SharedWorker脚本的网页。每次重新加载此页面时,Chrome内存使用量都会增加(点击F5)。

工作者脚本非常简单。每秒(使用setInterval)消息将被发送到连接端口。

每当我点击F5时,工作进程似乎终止并重新启动。这是我所期望的,因为工作人员实际上并没有被多个“文档”共享。但是,我无法弄清楚为什么每次刷新都会增加内存使用量。

有人知道为什么会这样吗?

鉴于每次重新加载页面时内存都会增加,这让我觉得我根本不能在Chrome中使用共享工作程序。有没有人能够在没有记忆问题的情况下这样做?

更新

这是托管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]);
}; 

托管页面启动/连接到共享工作人员并输出从中收到的任何内容。

工作代码保留已连接端口的列表,并每秒向它们发送一次消息。

这很简单。但是,每次在Chrome中重新加载托管页面时。该选项卡的内存负载会增加。

以下显示了几次刷新后Chrome的内存使用情况:

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

...更新了一些后,我达到了250 MB ...

Reaching 250 MB after some more refreshing

我的想法已经不多了,认为这肯定是Chrome中的一个错误。谁能给我一些指针?

更新2

停用我的AdBlock扩展程序似乎可以解决问题:

Running without AdBlock

所以我很高兴一段时间但事实证明记忆仍在泄露。禁用AdBlock后,每页刷新只会减少一点点。

2 个答案:

答案 0 :(得分:1)

似乎Chromium团队已经解决了这个问题。我不能再复制了它。

答案 1 :(得分:-3)

首先为SetInterval命名 myInterval = setInterval(“change()”,1000);

然后在PageExit或Leave etc

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的基础...它试图通过从该脚本加载相关负载作为缓存元素或其他东西来帮助你......

:)