Fiddle: https://jsfiddle.net/eimmot/065wxa9o/9/Утечка памяти с Web Worker/Canvas
Использование Chrome, запустите диспетчер задач (Shift + Esc), нажмите на кнопку рабочий инвертировать несколько раз, каждый раз, когда он идет вверх ~ 10 МБ. В любое время, когда я получаю сообщение от рабочего, память поднимается, это не изменение или доступ к холсту, это происходит, когда рабочий отправляет сообщение обратно в основной поток. Это становится все хуже, чем больше сообщение.
Добавление буфера ImageData в дополнительный переносчик список на postMessage не имеет значения, тот же результат, мне интересно, есть ли другой способ, которым я должен подходить к этому.
imageData = ctx.getImageData(0, 0, 800, 600);
worker.postMessage(imageData, [imageData.data.buffer]);
Все еще не имеет значения, является ли основной поток и/или рабочий поток передачей права собственности. Я вижу на консоли, что объект imageData фактически передает право собственности, но память все еще увеличивается! Я пробовал профилирование памяти с помощью инструментов chrome dev, но я не вижу, где это увеличение.
Принуждение GC в инструментах dev очищает память. Иногда 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 бета-м (64-разрядная версия)
Fiddle: https://jsfiddle.net/eimmot/065wxa9o/13/
Добавлена опция цикла, кажется, единственный способ освободить память - это прекратить поток, я хотел бы избежать создания новых потоков каждый раз, хотя и просто держать один открытым, потому что есть заметная задержка при создании нового каждый раз, когда
Я думаю, вы должны [сообщить об ошибке] (https://support.google.com/chrome/answer/95315?hl=en) с Chrome люди. В диспетчере задач вы можете щелкнуть правой кнопкой мыши и добавить столбец «JavaScript-память». Вы заметите, что в то время как фактическая память, используемая на вкладке, увеличивается, объем памяти, используемой для Javascript, остается прежним. Это, кажется, указывает на проблему вне вашего контроля (по крайней мере, из моего понимания). –