JavaRush /Blog Java /Random-VI /Trình thu gom rác trong Java
Diana
Mức độ

Trình thu gom rác trong Java

Xuất bản trong nhóm

Dòng hành vi của trình thu gom rác (trình thu hồi bộ nhớ)

Lập trình viên Java không cần giám sát việc phân bổ bộ nhớ vì trình thu gom rác tự động quản lý bộ nhớ. Trình thu gom rác được điều hành bởi Máy ảo Java (JVM). Trình thu gom rác là một quy trình có mức độ ưu tiên thấp, chạy định kỳ và giải phóng bộ nhớ được sử dụng bởi các đối tượng không còn cần thiết. Các JVM khác nhau có thuật toán thu gom rác khác nhau. Có một số thuật toán được sử dụng, ví dụ: thuật toán đếm tham chiếu hoặc thuật toán đánh dấu và cạo.Thu gom rác - 1

Chạy trình thu gom rác trong Java

JVM thường chạy trình thu gom rác khi bộ nhớ trống sắp hết. Nhưng hoạt động của trình thu gom rác không đảm bảo rằng sẽ luôn có đủ bộ nhớ trống. Nếu không có đủ bộ nhớ ngay cả sau khi khôi phục, JVM sẽ đưa ra ngoại lệ OutOfMemoryError. Xin lưu ý rằng JVM phải chạy trình thu gom rác ít nhất một lần trước khi đưa ra ngoại lệ. Bạn có thể yêu cầu trình thu gom rác chạy trong Java, nhưng bạn không thể ép buộc hành động này.

Yêu cầu chạy trình thu gom rác

Để thực hiện một yêu cầu, bạn có thể gọi một trong các phương thức sau:
System.gc()
Runtime.getRuntime().gc()

Sự phù hợp để chạy trình thu gom rác

Một đối tượng phải được xử lý khi nó không còn có sẵn cho luồng sống. Một đối tượng có thể bị xử lý trong các trường hợp khác nhau:
  • Nếu một biến thuộc loại tham chiếu tham chiếu đến một đối tượng được đặt thành "0", thì đối tượng đó phải bị loại bỏ nếu không có tham chiếu nào khác tới nó.
  • Nếu một biến thuộc loại tham chiếu tham chiếu đến một đối tượng được tạo để tham chiếu đến một đối tượng khác, thì đối tượng đó phải bị loại bỏ nếu không có tham chiếu nào khác tới nó.
  • Các đối tượng được tạo cục bộ trong một phương thức sẽ bị loại bỏ khi phương thức đó thoát, trừ khi chúng được xuất từ ​​phương thức đó (nghĩa là được trả về hoặc bị ném dưới dạng ngoại lệ).
  • Các đối tượng tham chiếu lẫn nhau có thể bị loại bỏ nếu không có đối tượng nào có sẵn cho luồng trực tiếp.
Hãy xem một ví dụ:
public class TestGC
  {
    public static void main(String [] args)
    {
      Object o1 = new Integer(3);               // Line 1
      Object o2 = new String("Tutorial");       // Line 2
      o1 = o2;                                  // Line 3
      o2 = null;                                // Line 4
      // Rest of the code here
    }
  }
Trong ví dụ này Integer, đối tượng (số nguyên) ban đầu được tham chiếu bởi o1 có thể bị loại bỏ sau dòng 3 vì o1 hiện đề cập đến đối tượng String(chuỗi). Mặc dù o2 được tạo để tham chiếu đến null, nhưng đối tượng String(chuỗi) không thể tái chế được vì o1 tham chiếu đến nó.

Quyết toán

Công nghệ Java cho phép bạn sử dụng một phương thức finalize()(hoàn thiện) để thực hiện việc dọn dẹp cần thiết trước khi trình thu gom rác lấy một đối tượng từ bộ nhớ. Phương thức này được trình thu gom rác gọi trên một đối tượng khi trình thu gom rác xác định rằng không còn tham chiếu nào đến đối tượng nữa. Điều này được mô tả trong lớp Object, có nghĩa là nó được kế thừa bởi tất cả các lớp. Lớp con ghi đè phương thức finalize()để tự giải phóng khỏi tài nguyên hệ thống hoặc để dọn dẹp khác:
protected void finalize() throws Throwable
Nếu một ngoại lệ chưa được đăng ký được ném ra bởi phương thức finalize(), ngoại lệ đó sẽ bị bỏ qua và quá trình hoàn thiện đối tượng đó sẽ dừng lại. Phương thức này finalize()sẽ chỉ được gọi một lần trong suốt vòng đời của đối tượng. Có thể sử dụng một phương pháp finalize()trên bất kỳ đồ vật nào để bảo vệ nó khỏi bị vứt bỏ. Nhưng trong trường hợp này, trình thu gom rác không còn được kích hoạt finalize()cho đối tượng này nữa. Phương thức này finalize()sẽ luôn được gọi một lần trước khi đối tượng được thu gom rác. Tuy nhiên, có thể phương thức này finalize()sẽ không được kích hoạt cho một đối tượng nhất định trong toàn bộ thời gian tồn tại của nó, vì nó có thể không bị loại bỏ.

Bản tóm tắt

Trong phần này, chúng ta đã xem xét quy trình thu gom rác, đây là một kỹ thuật quản lý bộ nhớ trong ngôn ngữ Java. Không thể ép buộc thu gom rác. Chúng tôi đã tìm hiểu về các cách khác nhau để làm cho đối tượng đủ điều kiện tái chế và biết rằng phương thức này finalize()được gọi trước khi đối tượng được người thu gom rác thu hồi.

Bài tập

Câu hỏi: Sau dòng 7, bao nhiêu đồ vật sẽ bị tiêu hủy?
public class TutorialGC
  {
    public static void main(String [] args)
    {
      Object a = new Integer(100);  // Line1
      Object b = new Long(100);     // Line2
      Object c = new String("100"); // Line3
      a = null;                     // Line4
      a = c;                        // Line5
      c = b;                        // Line6
      b = a;                        // Line7
      // Rest of the code here
    }
  }
Các phương án trả lời: A. 0 B. 1 C. 2 D. 3 E. Mã không thể biên dịch Phương án đúng: B Giải thích: Trong ba đối tượng được tạo ở dòng 1, 2 và 3, chỉ có đối tượng Integerphải được xử lý tại cuối dòng 7. Tham chiếu biến, a, ban đầu tham chiếu đến đối tượng Integer, tham chiếu đến đối tượng Stringtrên dòng 5. Do đó, Integerđối tượng phải được loại bỏ sau dòng 5, vì không có biến nào tham chiếu đến nó. Các biến bctham chiếu đến các đối tượng String, Longđối tượng ở dòng 6 và 7 nên không thể tái chế được.
Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION