繁体   English   中英

Web Worker / Canvas的内存泄漏

[英]Memory leak with Web Worker / Canvas

小提琴: https//jsfiddle.net/eimmot/065wxa9o/9/

使用Chrome,启动任务管理器(Shift + ESC),单击工作器反转按钮几次,每次上升~10 MB。 无论何时我从工作者那里收到一条消息,内存都会上升,它不是来自修改或访问画布,而是当工作人员将消息发送回主线程时。 消息越大,情况就越糟糕。

将ImageData缓冲区添加到postMessage上的可选transferables列表并没有什么不同,同样的结果,我想知道是否还有另一种方法我应该接近它。

  imageData = ctx.getImageData(0, 0, 800, 600);
  worker.postMessage(imageData, [imageData.data.buffer]);

主线程和/或工作线程是否正在转移所有权仍然无关紧要。 我可以在控制台中看到imageData对象实际上转移了所有权,但内存仍在增加! 我已经尝试使用chrome dev工具进行内存分析,但我无法看到增加的位置。

在dev工具中强制GC会清除内存。 有时GC会自动运行,有时它不会自动运行,只有GC运行时,它才会释放10%的分配量。

我昨晚看了很多网页,但他们都说了同样的话,我觉得我忽略了一些简单的事情。

可转让的对象: https//developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API/Using_web_workers#Passing_data_by_transferring_ownership_ ( transferable_objects

更新

Chrome版本48.0.2564.116 beta-m(64位)

小提琴: https//jsfiddle.net/eimmot/065wxa9o/13/

添加了一个循环选项,似乎释放内存的唯一方法就是终止线程,我想避免每次都创建新线程而只是保持一个打开,因为每次创建一个新的时都有明显的延迟

你没有内存泄漏。 这只是正常的GC行为,你可以做很多事情来阻止看似过多的内存使用。

我有一个发挥你的提琴改变代码,以便worker.onmessage立即调用的函数startWork ,有效地把它在一个循环中,发送数据,接收反转数据集,把它在画布上,然后调用startWork再次让它在我喝咖啡的时候去了。 它运行得很好。

观察chrome 49.0.2623.47 beta-m上的进程,内存使用量大约为110mb,但永远不会耗尽内存。 Heap分配和时间线都显示正常行为且没有泄漏。 Chrome已经对GC进行了一些更改,因此它推迟了它的操作以支持DOM和Javascript,如果您不习惯它,可能看起来内存使用率已经上升,没有什么可担心的。 重要的是,当你需要记忆时,它是可用的。 如果关键的低内存,GC将清理,并且最好有一些死内存,而不是在忙碌时阻止DOM或Javascript,只是为了转储一些不需要的内存。

我找到了一个适用于Chrome的解决方案。 我对你的小提琴的循环版本做了两个主要的修改:

  1. 从worker返回时,将imageData.data.buffer添加到传输列表中
  2. 传递类型化数组imageData.data ,而不是整个imageData对象

这是修改过的小提琴: https//jsfiddle.net/065wxa9o/14/

请注意, 只是将缓冲区添加到工作人员的传输列表不起作用( https://jsfiddle.net/065wxa9o/15/ )我只需要传输输入的数组。

Chrome版本52.0.2743.116(64位)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM