TopDev AI Robot TopDev
#Frontend & Web UI

Debug Memory Leak trong Single Page Application bằng Chrome DevTools Memory Profiler

Lan Anh (Senior Frontend)
📖 2 phút đọc 💬 1 phản hồi
⚡ Tóm tắt 30 giây bởi TopDev AI
AI Overview

Hiện tượng ứng dụng càng dùng lâu càng giật lag Trong các ứng dụng Single Page Application SPA, người dùng có thể mở tab và làm việc suốt 8 tiếng mà không hề F5 tải lại trang. Nếu mã nguồn có lỗi rò …

☰ Mục lục bài viết (4 phần) Mở / Đóng mục lục

Hiện tượng ứng dụng càng dùng lâu càng giật lag#

Trong các ứng dụng Single Page Application (SPA), người dùng có thể mở tab và làm việc suốt 8 tiếng mà không hề F5 tải lại trang.

Nếu mã nguồn có lỗi rò rỉ bộ nhớ:

  • Tab trình duyệt ngốn từ 80MB lên tới 1.5GB RAM.
  • Máy tính của người dùng bắt đầu hú quạt tản nhiệt, pin sụt nhanh.
  • Trình duyệt crash với thông báo "Out of Memory".

Dưới đây là quy trình 3 bước sử dụng Chrome DevTools Memory Profiler để truy tìm thủ phạm rò rỉ bộ nhớ.

Quy trình chụp Heap Snapshot 3 bước#

  1. Bước 1 (Chụp Snapshot ban đầu): Mở Chrome DevTools $\rightarrow$ Tab Memory $\rightarrow$ Chọn Heap Snapshot $\rightarrow$ Bấm nút "Take snapshot" (Snapshot 1).
  2. Bước 2 (Thực hiện hành động nghi ngờ): Mở một Modal phức tạp, cuộn danh sách, rồi đóng Modal lại (lặp lại 3 lần để rác tích tụ).
  3. Bước 3 (Chụp Snapshot so sánh): Bấm "Take snapshot" lần 2 (Snapshot 2). Đổi chế độ xem từ Summary sang Comparison (So sánh giữa Snapshot 2 và Snapshot 1).
CODE
Xem cột # Delta (Số lượng object tăng thêm):
Nếu thấy Detached HTMLElement hoặc EventListener có số Delta > 0, 
đó chính là rò rỉ bộ nhớ!

3 Thủ phạm Memory Leak phổ biến nhất trong React#

  1. Quên dọn dẹp Event Listener toàn cục:
    TYPESCRIPT
    useEffect(() => {
      const handleResize = () => { /* ... */ };
      window.addEventListener('resize', handleResize);
      // QUÊN RETURN HÀM CLEANUP:
      return () => window.removeEventListener('resize', handleResize);
    }, []);
    
  2. Quên hủy subscription của WebSocket hoặc Interval: Luôn nhớ clearInterval(timer).
  3. Detached DOM Tree: Một biến JavaScript toàn cục vẫn giữ tham chiếu tới một phần tử DOM đã bị gỡ khỏi trang.

Góc thảo luận#

Anh em đã từng dùng tab Memory Profiler để bắt memory leak ở frontend bao giờ chưa? Ca leak khó nhằn nhất mà anh em từng gặp là gì?


Xem thêm nội dung liên quan:

Chia sẻ thảo luận này:

Thảo luận

1 phản hồi

Ý kiến từ cộng đồng kỹ sư TopDev
💬

Tham gia thảo luận

Cộng đồng mở · Đăng nhập 1-chạm qua Google
  1. Quốc Bảo (Fullstack Developer)
    #1

    Detached DOM Tree là lỗi kinh điển nhất! Trước đây mình gán element vào một biến biến global để làm animation, khi component unmount rồi mà biến global vẫn giữ con trỏ thế là cả cây DOM 500 node không được GC giải phóng.

Bài liên quan trong #Frontend & Web UI

1
TopDev AI Companion
AI
✓ Đã sao chép link