我有一個應用程序在點擊按鈕後調用web worker。這些計算被轉移到工作人員以減輕用戶界面,並在計算時對用戶操作做出響應。使用Web Workers的可能的內存泄漏(垃圾收集器)
一切順利,約0.8-1.5秒後,工作人員發送回覆。在worker.onmessage中,我執行所有需要的DOM操作。但是在這個GC出現之後,根據CPU的不同,它實際上阻塞了用戶界面2秒或更長時間。這讓我很困惑,因爲UI阻止是我想要阻止的。
這裏的時間軸/存儲控制檯選項卡的截圖:http://i.imgur.com/zUoHa.jpg
正如你看到的只是所有DOM操作後GC事件發生。實際上只有一個重繪事件(使用DocumentFragment)。
主要js代碼:
var sortWorker = new Worker('js/contactsorter.js');
sortWorker.onmessage = function(e) {
var messages = [];
e.data.forEach(function(userDoc) {
var contactSection = _drawContact(userDoc);
messages.push(contactSection);
});
meta.append(messages); // this actually appends document fragment as a child
};
sortWorker.postMessage(postMessageData);
contactsorter.js(工人):
onmessage = function(e) {
var uid, output = [], usersStat = {};
// calculations...
postMessage(output);
close();
};
有什麼辦法,以避免在這個地方或沒有這些GC事件?
UPD:在我看來,GC事件(s)時間取決於發送給worker的數據量。 UPD2:關機和啓動後,GC事件只發生兩次,因此阻塞UI的時間不到一秒鐘。嗯?
對象有多大?多少?我們在聊什麼樣的數字?你創建了哪些DOM節點? GC事件是否與排序的聯繫數量成線性比例? –
JSON.stringify說它大概是2M。這些是有對象作爲子女的對象。工作人員響應(它輸出數組)後,我創建DocumentFragment並追加約。 400「div」元素。之後我將片段追加到DOM。關於最後一個問題 - 我需要重寫我的代碼來進行測試,所以稍後我會對此進行評論。順便說一句:新UPD –
關於最後一個問題:不,GC事件不根據數據量進行縮放。此外,我甚至無法在時間線http://i.imgur.com/psGpr.png上找到它,儘管在這段時間內UI正在計時。 –