简体   繁体   English

postMessage webworker 内存泄漏

[英]postMessage webworker memory leak

I'm using a webworker to pass some data at an interval of 10 ms.我正在使用网络工作者以 10 毫秒的间隔传递一些数据。 In the task manager I can see the working memory set increasing till I don't cancel the interval.在任务管理器中,我可以看到工作内存设置增加,直到我不取消间隔。

Here's what I'm doing:这是我在做什么:

Sending:发送:

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;
 }

I also tried to do only this, but with no success:我也尝试只这样做,但没有成功:

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

Anyone know why this might be leaking?有谁知道为什么这可能会泄漏? I'm currently trying this on Chrome.我目前正在 Chrome 上尝试这个。

Usually memory leaks in web workers are created while passing values multiple times between the main thread and the worker thread.通常在主线程和工作线程之间多次传递值时会造成 Web Worker 中的内存泄漏。
If possible try to send the array to the web worker only once.如果可能,尝试只将数组发送给网络工作者一次。
You can also detect if your Transferable Objects work properly (The array will be neutered)您还可以检测您的可转移对象是否正常工作(阵列将被绝育)

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!');
}

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

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