Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Java

Khác biệt giữa Stack và Heap trong Java

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.