ฉันได้บันทึกข้อผิดพลาดของ Chromeต่อไปนี้ซึ่งนำไปสู่การรั่วไหลของหน่วยความจำที่ร้ายแรงและไม่ชัดเจนในรหัสของฉัน:
(ผลลัพธ์เหล่านี้ใช้เครื่องมือสร้างโปรไฟล์หน่วยความจำของ Chrome Dev Tools ซึ่งรัน GC และจากนั้นใช้ภาพรวมกองของทุกสิ่งที่ไม่ได้เก็บรวบรวมไว้)
ในรหัสด้านล่างนี้someClass
อินสแตนซ์นั้นเก็บรวบรวมขยะ (ดี):
var someClass = function() {};
function f() {
var some = new someClass();
return function() {};
}
window.f_ = f();
แต่จะไม่เก็บขยะในกรณีนี้ (ไม่ดี):
var someClass = function() {};
function f() {
var some = new someClass();
function unreachable() { some; }
return function() {};
}
window.f_ = f();
และภาพหน้าจอที่สอดคล้องกัน:
ดูเหมือนว่าการปิด (ในกรณีนี้function() {}
) ทำให้วัตถุทั้งหมด "มีชีวิตอยู่" ถ้าวัตถุนั้นถูกอ้างอิงโดยการปิดอื่น ๆ ในบริบทเดียวกันไม่ว่าจะเป็นการปิดตัวเองหรือไม่
คำถามของฉันเกี่ยวกับการรวบรวมขยะในเบราว์เซอร์อื่น (IE 9+ และ Firefox) ฉันค่อนข้างคุ้นเคยกับเครื่องมือของ webkit เช่น JavaScript กองโปรไฟล์ แต่ฉันรู้เครื่องมือเบราว์เซอร์อื่น ๆ น้อยดังนั้นฉันจึงไม่สามารถทดสอบได้
กรณีใดบ้างในสามกรณีนี้ IE9 + และ Firefox จะรวบรวมขยะsomeClass
ใช่หรือไม่
unreachable
ฟังก์ชั่นที่ไม่เคยดำเนินการเพื่อให้ไม่มีอะไรถูกบันทึกจริง