8.1 Tham chiếu yếu trong Java
Có một số loại tham chiếu trong Java.
Có StrongReference - đây là những liên kết phổ biến nhất mà chúng tôi tạo ra hàng ngày.
Object object = new Object();//created an object
object = null;//can now be garbage collected
Và có ba loại liên kết “đặc biệt” - SoftReference, WeakReference, PhantomReference. Trên thực tế, chỉ có một sự khác biệt duy nhất giữa tất cả các loại liên kết - hành vi của GC với các đối tượng mà chúng đề cập đến. Chúng ta sẽ thảo luận chi tiết hơn về từng loại liên kết sau, nhưng bây giờ, kiến thức sau đây là đủ:
- SoftReference là một tham chiếu mềm, nếu GC thấy rằng một đối tượng chỉ có thể truy cập được thông qua một chuỗi các tham chiếu mềm, thì nó sẽ xóa đối tượng đó khỏi bộ nhớ. Có lẽ.
- WeakReference - một tham chiếu yếu, nếu GC thấy rằng một đối tượng chỉ có thể truy cập được thông qua một chuỗi các tham chiếu yếu, thì nó sẽ xóa đối tượng đó khỏi bộ nhớ.
- PhantomReference là một tham chiếu ảo, nếu GC thấy rằng một đối tượng chỉ khả dụng thông qua một chuỗi các tham chiếu ảo, thì nó sẽ xóa nó khỏi bộ nhớ. Sau vài lần chạy GC.
Bạn cũng có thể nói rằng các loại liên kết có một mức độ mềm mại nhất định:
- Một liên kết cứng thông thường là bất kỳ biến nào thuộc loại tham chiếu. Không được dọn sạch bởi bộ thu gom rác trước khi nó không được sử dụng.
- Tham khảo mềm . Đối tượng sẽ không gây ra việc sử dụng hết bộ nhớ - nó được đảm bảo sẽ bị xóa trước khi xảy ra lỗi OutOfMemoryError. Có thể sớm hơn, tùy thuộc vào việc triển khai bộ thu gom rác.
- Tham chiếu yếu . mềm yếu hơn. Không ngăn đối tượng bị xử lý; trình thu gom rác bỏ qua các tham chiếu đó.
- Phantom Tham khảo . Được sử dụng để xử lý "chết" một đối tượng: đối tượng có sẵn sau khi hoàn thiện cho đến khi nó được thu gom rác.
Nếu vẫn chưa rõ sự khác biệt là gì, thì đừng lo lắng, mọi thứ sẽ sớm đâu vào đấy. Các chi tiết nằm trong các chi tiết, và các chi tiết sẽ theo sau.
8.2 WeakReference và SoftReference trong Java
Đầu tiên, hãy xem sự khác biệt giữa WeakReference và SoftReference trong Java.
Tóm lại, bộ thu gom rác sẽ giải phóng bộ nhớ của một đối tượng nếu chỉ có các tham chiếu yếu trỏ đến nó. Nếu đối tượng được SoftReferences trỏ tới, thì bộ nhớ sẽ bị hủy cấp phát khi JVM đang rất cần bộ nhớ.
Điều này mang lại một lợi thế nhất định cho SoftReference so với tham chiếu Strong trong một số trường hợp nhất định. Ví dụ: SoftReference được sử dụng để triển khai bộ đệm ứng dụng, vì vậy điều đầu tiên mà JVM sẽ làm là xóa các đối tượng mà chỉ SoftReferences trỏ tới.
WeakReference rất lý tưởng để lưu trữ siêu dữ liệu, chẳng hạn như lưu trữ tham chiếu đến ClassLoader. Nếu không có lớp nào được tải, thì bạn không nên tham khảo ClassLoader. Đây là lý do tại sao WeakReference giúp trình thu gom rác có thể thực hiện công việc của nó trên ClassLoader ngay sau khi tham chiếu mạnh cuối cùng đến nó bị xóa.
Ví dụ về WeakReference trong Java:
// some object
Student student = new Student();
// weak reference to it
WeakReference weakStudent = new WeakReference(student);
// now the Student object can be garbage collected
student = null;
Ví dụ SoftReference trong Java:
// some object
Student student = new Student();
// weak reference to it
SoftReference softStudent = new SoftReference(student)
// now the Student object can be garbage collected
// but this will only happen if the JVM has a strong need for memory
student = null;
8.3 PhantomReference trong Java
Phiên bản PhantomReference được tạo theo cách tương tự như trong các ví dụ WeakReference và SoftReference, nhưng nó hiếm khi được sử dụng.
PhantomReference có thể được thu gom rác nếu đối tượng không có các tham chiếu mạnh (Strong), yếu (WeakReference) hoặc mềm (SoftReference).
Bạn có thể tạo một đối tượng Phantom Reference như thế này:
PhantomReference myObjectRef = new PhantomReference(MyObject);
PhantomReference có thể được sử dụng trong các tình huống mà việc hoàn thiện() không có ý nghĩa. Loại tham chiếu này khác với các loại khác vì nó không được thiết kế để truy cập một đối tượng. Đó là tín hiệu cho biết đối tượng đã được hoàn thiện và bộ thu gom rác sẵn sàng lấy lại bộ nhớ của nó.
Để làm điều này, bộ thu gom rác đặt nó vào một ReferenceQueue đặc biệt để xử lý thêm. ReferenceQueue là nơi đặt các tham chiếu đối tượng vào bộ nhớ trống.
Tham chiếu bóng ma là một cách an toàn để biết rằng một đối tượng đã bị xóa khỏi bộ nhớ. Ví dụ, hãy xem xét một ứng dụng xử lý các hình ảnh lớn. Giả sử chúng ta muốn tải một hình ảnh vào bộ nhớ khi nó đã có trong bộ nhớ, sẵn sàng để thu gom rác. Trong trường hợp này, chúng tôi muốn đợi trình thu gom rác hủy hình ảnh cũ trước khi tải hình ảnh mới vào bộ nhớ.
Ở đây PhantomReference là một sự lựa chọn linh hoạt và an toàn. Tham chiếu đến hình ảnh cũ sẽ được chuyển đến ReferenceQueue sau khi đối tượng hình ảnh cũ bị hủy. Khi chúng tôi có liên kết này, chúng tôi có thể tải hình ảnh mới vào bộ nhớ.