javascript - postMessage 网络 worker 内存泄漏

标签 javascript memory-leaks web-worker postmessage transferable

我正在使用网络 worker 以 10 毫秒的间隔传递一些数据。在任务管理器中,我可以看到工作内存集在增加,直到我不取消间隔。

这是我正在做的:

发送:

function send() {
 setInterval(function() { 
    const data = {
     array1: get100Arrays(),
     array2: get500Arrays()
    };

    let json = JSON.stringify( data );
    let arbfr = str2ab (json);
    worker.postMessage(arbfr, [arbfr]);
  }, 10);
}


function str2ab(str) {
   var buf = new ArrayBuffer(str.length*2); // 2 bytes for each char
   var bufView = new Uint16Array(buf);
   for (var i=0, strLen=str.length; i<strLen; i++) {
     bufView[i] = str.charCodeAt(i);
   }
   return buf;
 }

我也试过只这样做,但没有成功:

// let json =  JSON.stringify( data );
// let arbfr = str2ab(json);
worker.postMessage(data);

有人知道为什么会泄露吗?我目前正在 Chrome 上尝试这个。

最佳答案

Web Worker 中的内存泄漏通常是在主线程和工作线程之间多次传递值时产生的。
如果可能,请尝试仅将数组发送给网络 worker 一次。
您还可以检测您的 Transferable Objects 是否正常工作(阵列将被绝育)

var ab = new ArrayBuffer(1);

try {
   worker.postMessage(ab, [ab]);

   if (ab.byteLength) {
      console.log('TRANSFERABLE OBJECTS are not supported in your browser!');
   } 
   else {
     console.log('USING TRANSFERABLE OBJECTS');
   }
} 
catch(e) {
  console.log('TRANSFERABLE OBJECTS are not supported in your browser!');
}

关于javascript - postMessage 网络 worker 内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33224101/

相关文章:

javascript - Jquery 验证未触发且控制台中没有错误

javascript - 将多个参数从 thymeleaf 标签传递给 javascript 函数

javascript - 网络工作人员代表团(子工作人员)不工作

cors - Web worker 被 Cypress 上的 self.crossOriginIsolated 阻止

javascript - window.onpaint 是什么?

javascript - 在共享主机上运行 socket.io

Haskell HDBC-ODBC 内存泄漏?

javascript - 警告 : connect. session() MemoryStore 不是为生产环境设计的,因为它会泄漏内存,并且不会扩展到单个进程

c - 以下 C 代码中的内存泄漏

javascript - Web Workers - 他们创建实际的线程吗?