【发布时间】:2011-10-30 04:08:56
【问题描述】:
我有一个启动 HTML5 SharedWorker 脚本的网页。每次重新加载此页面(按 F5)时,Chrome 内存使用量都会增加。
worker 脚本非常简单。每一秒(使用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]);
};
托管页面启动/连接到共享工作器并输出从它接收到的任何内容。
worker 代码保存一个已连接端口的列表,并每秒向它们发送一条消息。
这很简单。然而,每次在 Chrome 中重新加载托管页面时。该选项卡的内存负载增加了。
以下显示了几次刷新后 Chrome 的内存使用情况:
...刷新后我达到了 250 MB...
我的想法已经不多了,我想这一定是 Chrome 中的一个错误。谁能给我一些指针?
更新 2
禁用我的 AdBlock 扩展似乎可以解决问题:
所以我高兴了一阵子,结果发现内存还在泄露。禁用 AdBlock 后,每次页面刷新的泄漏量要少得多。
【问题讨论】:
-
如果您使用
--purge-memory-button标志启动 Chrome,然后打开 Chrome 的任务管理器并单击“清除内存”按钮,您的扩展程序的内存是否恢复到初始水平,还是看起来仍然臃肿? -
@Chris 它仍然臃肿。膨胀的是托管页面的内存。后台线程(扩展)并不臃肿,每次刷新都会重新启动(在任务管理器中消失并重新出现)。
标签: html google-chrome memory-leaks web-worker