🟣 Stack
LIFO, nhanh, tự động giải phóng. Lưu biến local, function calls, return addresses.
🩷 Heap
Linh hoạt, chậm hơn, quản lý thủ công (hoặc GC). Lưu objects, dynamic data.
1. Stack Memory
Stack (LIFO — Last In First Out):
│ │
│ [local vars c] │ ← top (hàm C đang chạy)
│ [local vars b] │ (hàm B gọi C)
│ [local vars a] │ (hàm A gọi B)
│ [main()] │ ← bottom
└─────────────────┘
Khi hàm C return → pop frame C
Khi hàm B return → pop frame B
→ Tự động giải phóng, không cần GC!
// C: Stack allocation
void example() {
int x = 10; // Stack ← nhanh, tự giải phóng
int arr[5]; // Stack ← kích thước cố định
char name[20]; // Stack ← compile-time size
// Khi function return → tất cả biến trên stack bị POP
// → Tự động giải phóng, cực nhanh
}
// Stack overflow example:
void infinite() {
int bigArray[1000000]; // ~ 4MB
infinite(); // recursion → STACK OVERFLOW 💥
}
2. Heap Memory
Heap (dynamic, no order):
┌─────────────────────────────┐
│ [Object A] [ free ]│
│ [Object B] [Object D] │
│ [ free ] [Object E] │
│ [Object C] [ free ] │
└─────────────────────────────┘
→ Không có thứ tự, phân mảnh (fragmentation)
→ Cần malloc/free (C) hoặc GC (Java, Go, JS)
// C: Heap allocation (manual)
void example() {
// malloc → cấp phát trên Heap
int *arr = (int *)malloc(1000 * sizeof(int));
// Phải free thủ công → quên = MEMORY LEAK 💀
free(arr);
}
// JavaScript: Heap allocation (automatic GC)
function example() {
const obj = { name: "Alice" }; // Heap (GC quản lý)
const arr = [1, 2, 3, 4, 5]; // Heap
const str = "Hello World"; // Heap (strings)
// V8 Garbage Collector tự thu hồi khi không còn reference
}
3. Bảng So Sánh
| Tiêu chí | 🟣 Stack | 🩷 Heap |
|---|---|---|
| Cấp phát | Tự động (compile time) | Thủ công / GC (runtime) |
| Tốc độ | Rất nhanh (chỉ move pointer) | Chậm hơn (tìm vùng trống) |
| Size | Nhỏ (1-8 MB mặc định) | Lớn (giới hạn bởi RAM) |
| Giải phóng | Tự động (function return) | Manual (free) hoặc GC |
| Lưu gì | Primitives, pointers, frames | Objects, arrays, strings |
| Thread-safe | Có (mỗi thread 1 stack) | Không (shared, cần sync) |
| Lỗi | Stack Overflow | Memory Leak, fragmentation |
4. Trong JavaScript
V8 Engine:
• Stack: Primitives (number, string, boolean), function call frames
• Heap: Objects, arrays, closures, functions
• Variables trên stack chứa reference (pointer) đến object trên heap
let a = 10; // Stack: a = 10 (primitive)
let b = a; // Stack: b = 10 (copy giá trị)
b = 20; // a vẫn = 10 ✅
let obj1 = { x: 1 }; // Stack: obj1 = 0x001 (pointer) → Heap: { x: 1 }
let obj2 = obj1; // Stack: obj2 = 0x001 (copy pointer, CÙNG object)
obj2.x = 99; // obj1.x cũng = 99 ⚠️ (cùng reference)