Thuật toán Mark and Sweep
Cải tiến từ Reference-counting. Tìm các object không thể truy cập được (unreachable) thay vì "không còn cần thiết".
3 Bước chính
- Root: Biến toàn cục (global object - window trong browser). Dùng làm gốc để duyệt.
- Mark (Đánh dấu): Duyệt từ root, đánh dấu mọi object có thể truy cập được (reachable). Object không được đánh dấu = unreachable.
- Sweep (Dọn dẹp): Giải phóng bộ nhớ các object unmarked (unreachable).
Giai đoạn Mark
Ví dụ: var obj1 = { pro1: "hello" } → obj1 và "hello" reachable → marked.
Gán obj1 = null → null reachable (marked), "hello" trở thành unreachable (unmarked).
Giai đoạn Sweep
Object unmarked ("hello") bị garbage collected.
Xử lý Circular Reference (Tham chiếu vòng)
Khác với reference-counting, Mark-and-Sweep xử lý tốt vòng tròn:
function f() { var obj1 = {}; var obj2 = {}; obj1.p = obj2; obj2.p = obj1; } f();
Sau khi f() kết thúc, obj1, obj2 không còn reachable từ root → cả hai bị GC thu gom.
Hạn chế
Không thể ép buộc GC chạy tại thời điểm cụ thể trong JS hiện tại.