Bài đăng nổi bật

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
Nguồn: Quỳnh Trinh

Post a Comment

Mới hơn Cũ hơn