Phát hiện: Chrome DevTools > tab Memory, so sánh các heap snapshot.
Nguyên nhân thường gặp:
1. Quên cleanup subscription/timer trong useEffect.
2. Event listener không được remove.
3. Fetch không được huỷ bằng AbortController.
Cách sửa: luôn return cleanup function từ useEffect.
js
useEffect(() => {
const controller = new AbortController()
fetch(url, { signal: controller.signal })
return () => controller.abort()
}, [url])