Phân biệt Heap memory và Stack memory trong java .
Tóm Tắt
Bộ nhớ Heap – Heap Memory
- 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.
Bộ nhớ Stack – Stack Memory
- 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.
Ví dụ 1:
- Dòng thứ 1: khi khai báo
int i = 4
nó sẽ đưai = 4
vào stack - Dòng thứ 2: khi khai báo
y = 2
nó sẽ đưay = 2
vào stack (xếp trêni = 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ượngcls1
trong heap đồng thời chưa tham chiếu của đối tượngcls1
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.
Ví dụ 2:
Tương tự như ví dụ trên nhưng với trường hợp đối tượng người dùng đơn cử :
- Điều đặc biệt ở đây là khi bạn khai báo
String name = "kai"
. Giá trị"kai"
sẽ được lưu trong String pool và biến name trong stack thực hiện tham chiếu tới “kai
“. (String là kiểu dữ liệu đặc biệt, giá trị của nó luôn được lưu trong String pool) - Khi bạn khai báo
Person p = new Person(age, name)
nó sẽ tạo đối tượng p với age, name tương ứng vào bộ nhớ heap và thêm biến tham chiếu tới đối tượng p vào bộ nhớ tack.
Phân biệt Heap với Stack:
Okay, Done !
(Xem thêm: Lỗi stackoverflowerror trong Java)
( Xem thêm : Điều chỉnh kích cỡ, heap, stack cho ứng dụng Java )
( Xem thêm : String Pool là gì ? String Pool trong Java )
References :
https://docs.oracle.com/…/garbage_collect.html
https://gurunguns.wordpress.com/…/stack-heap-value-types-reference-types-boxing-and-unboxing/
Source: https://final-blade.com
Category : Kiến thức Internet