Phân biệt Heap memory và Stack memory trong java

Phân biệt Heap memory và Stack memory trong java.

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:

Phân biệt Heap memory và Stack memory trong java

  • 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.

Ví dụ 2:

Tương tự như ví dụ trên nhưng với trường hợp đối tượng cụ thể:

  • Đ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 memory và Stack memory trong java

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 thướ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/

stackjava.com