Web Worker/Canvas的内存泄漏

tom*_*m1e 5 javascript memory multithreading canvas worker

小提琴: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]);
Run Code Online (Sandbox Code Playgroud)

主线程和/或工作线程是否正在转移所有权仍然无关紧要.我可以在控制台中看到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/

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

The*_*Bit 2

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

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

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

请注意,将缓冲区添加到工作人员的传输列表中是行不通的(https://jsfiddle.net/065wxa9o/15/),我必须仅传输类型化数组。

Chrome 版本 52.0.2743.116(64 位)