Quản lý bộ nhớ trong Java
Bộ nhớ ngăn xếp là gì?
Ngăn xếp trong java là một phần của bộ nhớ chứa các phương thức, biến cục bộ và biến tham chiếu. Bộ nhớ ngăn xếp luôn được tham chiếu theo thứ tự Vào trước ra trước. Các biến cục bộ được tạo trong ngăn xếp.
Bộ nhớ Heap là gì?
Heap là một phần bộ nhớ chứa các Đối tượng và cũng có thể chứa các biến tham chiếu. Biến thể hiện được tạo trong heap.
Phân bổ bộ nhớ trong Java
Phân bổ bộ nhớ trong Java là quá trình trong đó các phần bộ nhớ ảo được dành riêng trong một chương trình để lưu trữ các biến và thể hiện của cấu trúc và lớp. Tuy nhiên, bộ nhớ không được cấp phát cho đối tượng khi khai báo mà chỉ tạo một tham chiếu. Để cấp phát bộ nhớ cho đối tượng, phương thức new() được sử dụng, do đó đối tượng luôn được cấp phát bộ nhớ trên heap.
Java Phân bổ bộ nhớ được chia thành các phần sau:
- ban ơn
- Sắp xếp
- Mã
- tĩnh
Việc phân chia bộ nhớ này là cần thiết để quản lý hiệu quả.
- mã phần chứa của bạn mã byte.
- Sắp xếp phần bộ nhớ chứa phương thức, biến cục bộ và biến tham chiếu.
- ban ơn phần chứa Đối tượng (cũng có thể chứa các biến tham chiếu).
- tĩnh phần chứa Dữ liệu/phương thức tĩnh.
Sự khác biệt giữa biến cục bộ và biến thể
Biến thể hiện được tuyên bố bên trong một lớp nhưng không bên trong một phương thức
class Student{ int num; // num is instance variable public void showData{}
Biến cục bộ được tuyên bố trong a phương pháp bao gồm phương pháp đối số.
public void sum(int a){ int x = int a + 3; // a , x are local variables; }
Sự khác biệt giữa ngăn xếp và đống
Nhấp chuột đây nếu video không thể truy cập được
Hãy lấy một ví dụ để hiểu rõ hơn. Hãy xem xét phương thức chính của bạn gọi phương thức m1
public void m1{ int x=20 }
Trong ngăn xếp java, một khung sẽ được tạo từ phương thức m1.
Biến X trong m1 cũng sẽ được tạo trong khung cho m1 trong ngăn xếp. (Xem hình ảnh bên dưới).
Phương thức m1 đang gọi phương thức m2. Trong ngăn xếp java, một khung mới được tạo cho m2 ở trên khung m1.
Biến b và c cũng sẽ được tạo trong khung m2 trong ngăn xếp.
public void m2(int b){ boolean c; }
Phương thức m2 cũng đang gọi phương thức m3. Một lần nữa, một khung m3 được tạo ở đầu ngăn xếp (xem hình ảnh bên dưới).
Bây giờ, giả sử phương thức m3 của chúng ta đang tạo một đối tượng cho lớp “Tài khoản”, có hai biến thể hiện int p và int q.
Account { Int p; Int q; }
Đây là mã cho phương thức m3
public void m3(){ Account ref = new Account(); // more code }
Câu lệnh new Account() sẽ tạo một đối tượng account trong heap.
Biến tham chiếu “ref” sẽ được tạo trong ngăn xếp java.
Toán tử gán “=” sẽ tạo một biến tham chiếu để trỏ đến đối tượng trong Heap.
Sau khi phương thức hoàn tất quá trình thực thi. Luồng điều khiển sẽ quay trở lại phương thức gọi. Trong trường hợp này là phương thức m2.
Ngăn xếp từ phương thức m3 sẽ bị xóa.
Vì biến tham chiếu sẽ không còn trỏ đến đối tượng trong vùng heap nữa nên nó sẽ đủ điều kiện để thu gom rác.
Khi phương thức m2 hoàn tất quá trình thực thi. Nó sẽ được đẩy ra khỏi ngăn xếp và tất cả các biến của nó sẽ bị xóa và không còn khả dụng để sử dụng nữa.
Tương tự như phương pháp m1.
Cuối cùng, luồng điều khiển sẽ quay trở lại điểm bắt đầu của chương trình. Thông thường, đó là phương pháp "chính".
Điều gì sẽ xảy ra nếu Object có một tham chiếu làm biến thể hiện của nó?
public static void main(String args[]) { A parent = new A(); //more code } class A{ B child = new B(); int e; //more code } class B{ int c; int d; //more code }
Trong trường hợp này, biến tham chiếu “child” sẽ được tạo trong heap, lần lượt sẽ trỏ đến đối tượng của nó, giống như sơ đồ hiển thị bên dưới.
Thu gom rác là gì Java?
Thu gom rác ở Java là một quá trình trong đó các chương trình thực hiện quản lý bộ nhớ một cách tự động. Garbage Collector(GC) tìm các đối tượng không sử dụng và xóa chúng để lấy lại bộ nhớ. TRONG Java, việc phân bổ bộ nhớ động của các đối tượng được thực hiện bằng cách sử dụng toán tử new sử dụng một số bộ nhớ và bộ nhớ vẫn được phân bổ cho đến khi có các tham chiếu để sử dụng đối tượng.
Khi không có tham chiếu đến một đối tượng, nó được coi là không còn cần thiết nữa và bộ nhớ mà đối tượng đó chiếm giữ có thể được lấy lại. Không có nhu cầu rõ ràng để phá hủy một đối tượng như Java tự động xử lý việc phân bổ lại.
Kỹ thuật thực hiện điều này được gọi là Thu gom rác thải. Các chương trình không phân bổ lại bộ nhớ cuối cùng có thể bị lỗi khi không còn bộ nhớ trong hệ thống để phân bổ. Những chương trình này được cho là có rò rỉ bộ nhớ. Thu gom rác ở Java xảy ra tự động trong suốt vòng đời của chương trình, loại bỏ nhu cầu phân bổ lại bộ nhớ và do đó tránh rò rỉ bộ nhớ.
Trong ngôn ngữ C, trách nhiệm của người lập trình là phân bổ lại bộ nhớ được phân bổ động bằng hàm free(). Đây là nơi Java dẫn quản lý bộ nhớ.
Lưu ý: Tất cả các đối tượng được tạo trong Heap Section của bộ nhớ. Thông tin chi tiết về điều này sẽ có trong hướng dẫn sau.
Ví dụ: Tìm hiểu cơ chế thu gom rác trong Java
Bước 1) Sao chép đoạn mã sau vào trình soạn thảo.
class Student{ int a; int b; public void setData(int c,int d){ a=c; b=d; } public void showData(){ System.out.println("Value of a = "+a); System.out.println("Value of b = "+b); } public static void main(String args[]){ Student s1 = new Student(); Student s2 = new Student(); s1.setData(1,2); s2.setData(3,4); s1.showData(); s2.showData(); //Student s3; //s3=s2; //s3.showData(); //s2=null; //s3.showData(); //s3=null; //s3.showData(); } }
Bước 2) Lưu, biên dịch và chạy mã. Như thể hiện trong sơ đồ, hai đối tượng và hai biến tham chiếu được tạo.
Bước 3) Bỏ chú thích dòng #20,21,22. Lưu, biên dịch và chạy mã.
Bước 4) Như được hiển thị trong sơ đồ bên dưới, hai biến tham chiếu đang trỏ đến cùng một đối tượng.
Bước 5) Dòng Uncomment #23 & 24. Biên dịch, Lưu & Chạy code
Bước 6) Như minh họa trong sơ đồ bên dưới, s2 trở thành null, nhưng s3 vẫn trỏ đến đối tượng và không đủ điều kiện để thu thập rác java.
Bước 7) Dòng bỏ ghi chú # 25 & 26. Lưu, biên dịch và chạy mã
Bước 8) Tại thời điểm này không có tham chiếu nào trỏ đến đối tượng và đủ điều kiện để thu gom rác. Nó sẽ bị xóa khỏi bộ nhớ và không có cách nào lấy lại được.
Cách xóa một đối tượng trong Java?
1) Nếu bạn muốn làm cho đối tượng của mình đủ điều kiện cho Bộ sưu tập rác, hãy gán biến tham chiếu của nó thành null.
2) Kiểu nguyên thủy không phải là đối tượng. Chúng không thể được gán null.
Tóm tắt:
- Khi một phương thức được gọi, một khung sẽ được tạo ở trên cùng của ngăn xếp.
- Khi một phương thức đã hoàn thành việc thực thi, luồng điều khiển sẽ quay trở lại phương thức gọi và khung ngăn xếp tương ứng của nó sẽ bị xóa.
- Các biến cục bộ được tạo trong ngăn xếp
- Các biến thể hiện được tạo trong heap và là một phần của đối tượng mà chúng thuộc về.
- Các biến tham chiếu được tạo trong ngăn xếp.