Tôi có một ứng dụng gọi nhân viên web sau khi nhấp vào nút. Các tính toán được chuyển đến công nhân để giảm giao diện người dùng và làm cho nó đáp ứng với hành động của người dùng trong khi tính toán đang được thực hiện.Rò rỉ bộ nhớ có thể xảy ra khi sử dụng Nhân viên Web (Bộ thu gom rác)
Mọi thứ đều ổn và sau khoảng 0.8-1.5s, nhân viên sẽ gửi phản hồi. Trong worker.onmessage tôi thực hiện tất cả các hành động DOM cần thiết. Nhưng sau khi GC này xuất hiện và thực tế chặn giao diện người dùng trong 2 giây trở lên tùy thuộc vào CPU. Điều này thực sự gây nhầm lẫn cho tôi, bởi vì chặn UI là những gì tôi muốn ngăn chặn.
Dưới đây là ảnh chụp màn hình của giao diện điều khiển tab timeline/bộ nhớ: http://i.imgur.com/zUoHa.jpg
Như bạn có thể xem các sự kiện GC xảy ra chỉ sau khi tất cả thao tác DOM. Trên thực tế chỉ có một sự kiện repaint (DocumentFragment được sử dụng).
js chính mã:
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 (công nhân):
onmessage = function(e) {
var uid, output = [], usersStat = {};
// calculations...
postMessage(output);
close();
};
Có cách nào để tránh những sự kiện GC ở nơi này hay không?
UPD: có vẻ như với tôi rằng thời gian của sự kiện GC phụ thuộc vào số lượng dữ liệu đã được gửi tới công nhân. UPD2: Sau khi tắt máy và khởi động các sự kiện GC xảy ra chỉ hai lần do đó ngăn chặn giao diện người dùng trong ít hơn một giây. Hm?
Các vật thể lớn đến mức nào? Bao nhiêu? Chúng ta đang nói về loại số nào? Bạn đang tạo nút DOM nào? Quy mô sự kiện GC có tuyến tính với số lượng liên hệ được sắp xếp không? –
JSON.stringify nói rằng đó là khoảng 2M.Đây là những đối tượng có đối tượng như con cái của họ. Sau khi phản hồi của nhân viên (nó xuất ra một mảng), tôi tạo DocumentFragment và gắn thêm khoảng. 400 "div" yếu tố cho nó. Sau đó, tôi nối thêm đoạn mã vào DOM. Về câu hỏi cuối cùng - tôi cần phải viết lại mã của mình để thực hiện bài kiểm tra, vì vậy tôi sẽ bình luận sau này một chút.Btw: UPD mới –
Về câu hỏi cuối cùng: không, sự kiện GC không quy mô theo số lượng dữ liệu. Hơn nữa, tôi thậm chí không thể tìm thấy nó trên dòng thời gian http://i.imgur.com/psGpr.png mặc dù trong khoảng thời gian này giao diện người dùng đang được định giờ. –