Nguyên nhân chính leak trong ngôn ngữ GC: **unwanted references (tham chiếu không cần thiết)** — object không bao giờ trở thành unreachable.
Cơ chế GC: Mark-and-Sweep
- Root:
window(global object). - Duyệt đệ quy từ root, đánh dấu reachable.
- Thu hồi unreachable.
4 loại leak thường gặp
1. Global variables vô tình
function test() { a = [1,2,3]; } // thiếu let/var/const
test(); console.log(a); // [1,2,3] — leak global scope
Sửa: Luôn dùng let/const/var.
2. Closures
Biến outer function bị giữ bởi inner function dù không dùng → không GC được.
3. Detached DOM / Out-of-DOM reference
Node DOM bị remove khỏi tree nhưng JS vẫn giữ reference → cả subtree không GC được. Luôn xóa reference JS khi done với DOM node.
4. Event Listeners
DOM element và listener lifecycle khác nhau → leak. Dùng removeEventListener hoặc {once: true} / AbortController.
Công cụ debug: Chrome DevTools → Memory tab → Heap snapshot / Allocation timeline.