JVM chia không gian bộ nhớ thành hai phần chính: Stack (ngăn xếp) và Heap (đống). Vùng nhớ Stack chủ yếu dùng để lưu trữ thứ tự thực thi phương thức và các biến cục bộ.
Đặc điểm chính
- Stack: Luôn lưu trữ các khối theo thứ tự LIFO (Last In First Out - Vào sau ra trước).
- Heap: Sử dụng cấp phát động để cấp phát và giải phóng các khối bộ nhớ.
Vòng đời bộ nhớ
Bộ nhớ được cấp phát cho Heap tồn tại cho đến khi:
- Chương trình kết thúc
- Bộ nhớ được giải phóng rõ ràng (Garbage Collection)
Ngược lại, bộ nhớ trên Stack tồn tại cho đến khi hàm trả về (function returns).
Bảng so sánh chi tiết
| STT | Tiêu chí | Stack | Heap |
|---|---|---|---|
| 1 | Mục đích cơ bản | Lưu trữ các mục có vòng đời ngắn như biến cục bộ, biến tham chiếu đối tượng | Cấp phát để lưu trữ đối tượng và các class JRE |
| 2 | Thứ tự cấp phát | Luôn theo thứ tự LIFO | Cấp phát động, không có mẫu cố định |
| 3 | Kích thước | Tăng kích thước qua tham số JVM -Xss |
Tăng/giảm qua -Xms (khởi tạo) và -Xmx (tối đa) |
| 4 | Độ hiển thị | Biến chỉ hiển thị với thread sở hữu (thread-local) | Hiển thị với tất cả các thread (shared memory) |
| 5 | Ngoại lệ thường gặp | java.lang.StackOverflowError |
java.lang.OutOfMemoryError |
Lưu ý quan trọng
Stack thường nhanh hơn Heap do cơ chế cấp phát đơn giản (con trỏ stack), nhưng dung lượng hạn chế. Heap lớn hơn, được quản lý bởi Garbage Collector, phù hợp cho đối tượng sống lâu hoặc chia sẻ giữa các thread.