Tôi đã ghi lại lỗi Chrome sau đây , dẫn đến nhiều rò rỉ bộ nhớ nghiêm trọng và không rõ ràng trong mã của tôi:
(Các kết quả này sử dụng trình lược tả bộ nhớ của Chrome Dev Tools , chạy GC, và sau đó chụp ảnh toàn bộ mọi thứ không được thu thập.)
Trong mã dưới đây, someClass
ví dụ là rác được thu thập (tốt):
var someClass = function() {};
function f() {
var some = new someClass();
return function() {};
}
window.f_ = f();
Nhưng nó sẽ không phải là rác được thu thập trong trường hợp này (xấu):
var someClass = function() {};
function f() {
var some = new someClass();
function unreachable() { some; }
return function() {};
}
window.f_ = f();
Và ảnh chụp màn hình tương ứng:
Dường như một bao đóng (trong trường hợp này function() {}
) giữ cho tất cả các đối tượng "sống" nếu đối tượng được tham chiếu bởi bất kỳ bao đóng nào khác trong cùng một bối cảnh, cho dù chính nó có thể truy cập được hay không.
Câu hỏi của tôi là về bộ sưu tập rác đóng cửa trong các trình duyệt khác (IE 9+ và Firefox). Tôi khá quen thuộc với các công cụ của webkit, chẳng hạn như trình lược tả heap JavaScript, nhưng tôi biết rất ít các công cụ của các trình duyệt khác, vì vậy tôi chưa thể kiểm tra điều này.
Trong trường hợp nào trong ba trường hợp này, IE9 + và Firefox sẽ thu thập someClass
cá thể?
unreachable
hàm không bao giờ được thực thi nên không có gì thực sự được ghi lại.