Khi khởi chạy một
chương trình Java, JVM (Java Virtual Machine) sẽ request hệ điều hành cung cấp
một vùng nhớ trong RAM để thực thi chương trình. Vùng nhớ này sẽ được chia
thành 2 phần chính là Heap và Stack.
Bộ nhớ Stack
- Là một vùng nhớ được sử dụng để lưu trữ các tham
số và các biến local của phương thức mỗi khi một phương thức được gọi ra.
- Stack memory được sử dụng cho quá trình thực thi
của mỗi thread.
- Stack memory bao gồm các giá trị cụ thể của
method: các biến local và các tham chiếu tới các đối tượng chứa ở trong heap
memory được tham chiếu bởi method.
- Stack memory được tham chiếu theo thứ tự LIFO
(Last In First Out – vào cuối cùng thì ra đầu tiên). Tức là lưu trữ kiểu ngăn xếp
(stack). Khi có một method được thực thi, một block được tạo ra trong stack memory
để chứa các biến nguyên thủy local và các tham chiếu tới các object. Khi method
kết thúc, block đó sẽ không còn được sử dụng và được phục vụ cho method tiếp
theo.
- Stack memory có kích thước rất nhỏ so với Heap
memory.
Bộ nhớ Heap
- Heap memory là bộ nhớ được sử dụng bởi Java
Runtime để cấp phát bộ nhớ cho các đối tượng (object) và String.
- Bất kỳ khi nào có một đối tượng được tạo, nó sẽ được
tạo lưu ở bộ nhớ Heap.
- Bộ dọn rác (Garbage Collection) chạy trên heap
memory để giải phóng bộ nhớ được sử dụng bởi các đối tượng có bất kỳ tham chiếu
nào.
Ví dụ về lưu trữ
trong bộ nhớ Stack và Heap
- Dòng thứ 1: khi khai báo int i = 4 nó sẽ đưa i =
4 vào stack
- Dòng thứ 2: khi khai báo y = 2 nó sẽ đưa y = 2
vào stack (xếp trên i = 4)
- Dòng thứ 3: khi khai báo class1 cls1 = new
class1(): đây là kiểu đối tượng nên nó sẽ tạo đối tượng cls1 trong heap đồng thời
chứa tham chiếu của đối tượng cls1 vào stack (xếp trên cùng trong stack).
- Sau khi kết thúc method, bộ nhớ trong stack được
giải phóng, còn bộ nhớ trong heap thì chưa. Bộ nhớ trong heap phải chờ cho tới
khi garbage collector (bộ dọn rác) của Java quét qua để giải phóng.
Một số điểm cần lưu
ý với bộ nhớ head và bộ nhớ stack
Ở ví dụ trên, nếu
ta thêm một biến int z = y thì bộ nhớ stack sẽ tạo thêm một biến z = 2 Còn nếu ta thêm class cls 2
= cls 1 thì lúc nào trong bộ nhớ stack sẽ tạo
ra đối tượng cls và sẽ tham chiếu đến đối tượng cls trong heap chứ không tạo
thêm đối tượng ở heap
Đăng nhận xét