2

我正在使用webworker以10毫秒的間隔傳遞一些數據。在任務管理器中,我可以看到工作記憶集增加,直到我不取消間隔。postMessage webworker內存泄漏

下面是我在做什麼:

發送:

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上嘗試此操作。

回答

1

通常,web worker中的內存泄漏是在主線程和輔助線程之間多次傳遞值時創建的。
如果可能,請嘗試僅將數組發送給Web工作人員一次。
您也可以檢測,如果你的轉換對象正常工作(陣列將被閹割)

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

由於工作的性質,它必須非常頻繁地發送。只發送一次使得看到內存變化很難。 – roro

+1

也許您的可傳輸對象無法正常工作。嘗試返回bufView而不是buf並調用worker.postMessage(bufView.buffer,[bufView.buffer]) – Sagi

+0

我嘗試使用您發佈的解決方案來檢查可傳輸對象是否正常工作,並嘗試使用bufView而不是buf。這兩個都沒有阻止內存的增加。 – roro