JS Stack vs Heap Memory

Tran Van Ngoc|

Tài liệu này là một ghi chép Layer 2 mô tả chi tiết cách JavaScript (V8 Engine) triển khai phân tầng bộ nhớ Stack và Heap, dựa trên nguyên lý khoa học máy tính cốt lõi của Stack_vs_Heap_Memory_Fundamentals.

TL;DR

Bộ nhớ trong JavaScript được chia làm hai vùng chính: Stack và Heap. Stack lưu trữ các kiểu dữ liệu nguyên thủy (Primitive Values) và con trỏ tham chiếu (Reference Pointers) với cơ chế LIFO tĩnh ở cấp độ phần cứng. Heap lưu trữ các cấu trúc dữ liệu động có kích thước không cố định như Object, Array và Closure. Đăng ký và giải phóng bộ nhớ Stack xảy ra tự động khi kết thúc Stack Frame, trong khi bộ nhớ Heap cần được dọn dẹp bởi Garbage Collector JS_Generational_Garbage_Collection để phòng ngừa hiện tượng rò rỉ bộ nhớ JS_Memory_Leaks_and_Mitigation.


Core Concept

1. Stack Memory

  • Đặc điểm: Lưu trữ các kiểu dữ liệu nguyên thủy (Number, String, Boolean, null, undefined, Symbol, BigInt) và con trỏ tham chiếu (Reference Pointers) trỏ đến vị trí bộ nhớ trên Heap.
  • Cơ chế hoạt động: Gán trực tiếp giá trị vào ô nhớ. Khi một hàm được thực thi, một Stack Frame (khung ngăn xếp) chứa ngữ cảnh thực thi (Execution Context) và biến cục bộ được đẩy vào Stack. Khi hàm kết thúc, toàn bộ Stack Frame được thu hồi lập tức ở cấp độ CPU mà không tốn chi phí rác.

2. Heap Memory

  • Đặc điểm: Lưu trữ các đối tượng phức tạp có thể thay đổi kích thước linh hoạt trong runtime (Object, Array, Function, Closure).
  • Cơ chế hoạt động: Hệ thống cấp phát vùng nhớ trống trên Heap và trả về một địa chỉ ô nhớ. Biến khai báo trên Stack chỉ lưu trữ địa chỉ con trỏ này. Do bộ nhớ Heap cấp phát động, nó không tự động hủy khi hàm kết thúc mà cần bộ dọn rác JS_Generational_Garbage_Collection quét qua để giải phóng các vùng nhớ không còn truy cập được, tránh nguy cơ phát sinh JS_Memory_Leaks_and_Mitigation.

Practical Implementation

So sánh Đặc tính Kỹ thuật giữa Stack và Heap

Tiêu chíStack MemoryHeap Memory
Loại dữ liệuPrimitives & Con trỏ tham chiếuObjects, Arrays, Functions, Closures
Kích thướcNhỏ, cố định tại thời điểm cấp phátLớn, linh hoạt phình to ở runtime
Tốc độ truy cậpCực nhanh (LIFO phần cứng CPU)Chậm hơn (phải tra cứu qua địa chỉ con trỏ)
Quản lý giải phóngTự động hủy khi Stack Frame kết thúcKhông đồng bộ bởi Garbage Collector