#1. Bản chất (Garbage Collector)
V8 engine dùng thuật toán Mark-and-Sweep. Nó tìm các đối tượng “không thể chạm tới” (unreachable) từ root (window/global) để giải phóng.
#2. Nguyên nhân gây Leak
- Dangling Listeners: Gắn sự kiện vào
windowhoặcdocumentnhưng quênremovekhi Component unmount. - Closures bất tận: Giữ tham chiếu tới các object khổng lồ trong một Closure tồn tại lâu dài.
- Detached DOM: Xóa phần tử khỏi DOM nhưng vẫn giữ tham chiếu trong biến JS (cái biến đó ngăn không cho GC dọn phần tử DOM).
#3. Công cụ Debug
- Chrome Heap Snapshot: So sánh 2 lần snapshot. Tìm đối tượng nào không được giải phóng.
- Performance Monitor: Theo dõi biểu đồ RAM, nếu sau khi GC (nút trash icon) mà RAM không giảm xuống mức nền, tức là có Leak.
#4. Quizz Senior
Q: “Làm sao tránh leak ở các thư viện bên thứ 3?”
A: Luôn check tài liệu để xem thư viện có cung cấp hàm destroy() hoặc dispose() hay không. Hãy gọi nó trong useEffect cleanup function hoặc componentWillUnmount.