【问题标题】:postMessage webworker memory leakpostMessage webworker 内存泄漏
【发布时间】:2015-10-19 21:18:31
【问题描述】:

我正在使用网络工作者以 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 上尝试这个。

【问题讨论】:

    标签: javascript memory-leaks web-worker postmessage transferable


    【解决方案1】:

    通常,在主线程和工作线程之间多次传递值时,会在 Web 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!');
    }
    

    【讨论】:

    • 由于工作性质,必须非常频繁地发送。而且只发送一次就很难看到内存的变化。
    • 可能您的可转移对象工作不正常。尝试返回 bufView 而不是 buf 并调用 worker.postMessage(bufView.buffer, [bufView.buffer])
    • 我尝试使用您发布的解决方案来检查可转移对象是否正常工作,并尝试使用 bufView 代替 buf。这两者都没有阻止内存增加。
    • 可能你分配内存的速度比垃圾回收的一次性对象的速度快,我建议你提高 setInterval 的毫秒数并检查垃圾收集器是否可以管理释放一些内存。
    • 好像不是这样。我将其更改为 5000 ms 和同样的事情。内存使用量根本没有下降。
    猜你喜欢
    • 2021-07-12
    • 1970-01-01
    • 1970-01-01
    • 2011-10-08
    • 2013-01-20
    • 2011-10-31
    • 2019-08-10
    • 2013-06-24
    • 2011-03-22
    相关资源
    最近更新 更多