Trong lập trình và bộ nhớ máy tính, Stack và Heap là hai khu vực chính trong RAM được sử dụng để lưu trữ dữ liệu khi một chương trình chạy. Dưới đây là giải thích chi tiết:
1. Stack (Ngăn xếp)
- Mục đích: Lưu trữ dữ liệu tạm thời như biến cục bộ, tham số hàm, và địa chỉ trả về của hàm.
- Cách hoạt động: Stack hoạt động theo cơ chế LIFO (Last In, First Out) – dữ liệu vào sau sẽ ra trước.
- Đặc điểm:
- Tốc độ nhanh: Do hoạt động theo cấu trúc ngăn xếp nên việc thêm/xóa dữ liệu rất nhanh.
- Kích thước cố định: Bộ nhớ stack có kích thước cố định, được xác định khi chương trình khởi chạy.
- Phạm vi ngắn hạn: Dữ liệu trong stack bị xóa ngay khi hàm kết thúc hoặc khi biến ra khỏi phạm vi sử dụng.
- Ví dụ:
function add(a, b) { let sum = a + b; // 'sum' được lưu trên stack return sum; } add(3, 5);
Trong ví dụ trên:
- Các tham số
a
vàb
, cùng với biếnsum
, được lưu trong stack. - Khi hàm kết thúc, bộ nhớ này được giải phóng.
2. Heap (Đống)
- Mục đích: Lưu trữ dữ liệu lớn hoặc dữ liệu có tuổi thọ dài hơn, chẳng hạn như đối tượng và mảng.
- Cách hoạt động: Heap là một khu vực bộ nhớ lớn và không có cấu trúc cố định, cho phép lưu trữ và truy cập dữ liệu động.
- Đặc điểm:
- Kích thước linh hoạt: Bộ nhớ heap có thể mở rộng nếu cần thêm không gian (dựa trên bộ nhớ vật lý).
- Chậm hơn stack: Do dữ liệu được truy cập thông qua con trỏ và cần thêm thời gian quản lý.
- Dữ liệu tồn tại lâu dài: Bộ nhớ trong heap không bị tự động giải phóng; lập trình viên cần quản lý (hoặc trình dọn rác – Garbage Collector sẽ thực hiện).
- Ví dụ:
let obj = { name: 'John', age: 30 }; // Đối tượng này lưu trên heap let arr = [1, 2, 3]; // Mảng này cũng lưu trên heap
Trong ví dụ trên:
obj
vàarr
được lưu trong heap, nhưng tham chiếu (con trỏ) của chúng được lưu trong stack.
So sánh Stack và Heap
Đặc điểm | Stack | Heap |
---|---|---|
Quản lý | Tự động (xóa sau khi phạm vi kết thúc) | Thủ công hoặc nhờ Garbage Collector |
Tốc độ | Nhanh | Chậm hơn do cần tìm kiếm và quản lý |
Cấu trúc | Có tổ chức (LIFO) | Không có cấu trúc cố định |
Kích thước | Cố định | Linh hoạt |
Dữ liệu lưu trữ | Biến cục bộ, tham số hàm | Đối tượng, mảng, dữ liệu động |
Tóm tắt:
- Stack: Dùng cho dữ liệu ngắn hạn, truy cập nhanh, có giới hạn kích thước.
- Heap: Dùng cho dữ liệu lớn hoặc tồn tại lâu dài, linh hoạt nhưng chậm hơn.
Bạn có thể hình dung:
- Stack giống như một ngăn kệ nhỏ, nhanh chóng để lưu trữ và truy cập.
- Heap giống như một kho hàng lớn, linh hoạt nhưng mất thời gian để tìm đồ và quản lý.

Dương Trần Hà, hiện mình đang là kỹ công nghệ phần mềm và cũng là giám đốc thành lập công ty DTH Solutions. Mình có nhiều năm kinh nghiệm, kiến thức chuyên môn lập trình, nodejs, nestjs, laravel, yii2, reactjs, nextjs. Mình đã phát triển rất nhiều dự án thực tế cho doanh nghiệp, cơ quan. Mình đã đạt được một số thành công nhỏ, đồng thời mình vẫn đang tiếp tục học tập để trau dồi kiến thức mỗi ngày. Mình rất yêu thích công nghệ, đam mê chia sẻ những kiến thức, thông tin hữu ích cho mọi người.