Trong Java, các loại reference (tham chiếu) đóng vai trò quan trọng trong quản lý bộ nhớ, đặc biệt là trong cách xử lý các đối tượng khi xảy ra quá trình thu gom rác (Garbage Collection). Trong đó, Soft Reference và Weak Reference là hai loại tham chiếu yếu (non-strong references), mỗi loại có mục đích và cách hoạt động riêng khi Java quản lý bộ nhớ. Dưới đây là sự khác biệt chi tiết giữa chúng.
SoftReference<Object> softRef = new SoftReference<>(new Object());
Object obj = softRef.get(); // Truy xuất đối tượng từ Soft Reference
WeakReference<Object> weakRef = new WeakReference<>(new Object());
Object obj = weakRef.get(); // Truy xuất đối tượng từ Weak Reference
Tiêu chí | Soft Reference | Weak Reference |
---|---|---|
Mức độ ưu tiên thu gom rác | Thu gom khi JVM thiếu bộ nhớ. | Thu gom ngay lập tức trong lần thu gom rác tiếp theo, bất kể bộ nhớ. |
Thời gian tồn tại của đối tượng | Đối tượng có thể tồn tại lâu hơn, chỉ bị thu gom khi thiếu bộ nhớ. | Đối tượng sẽ bị thu gom ngay khi không có Strong Reference nào. |
Ứng dụng phổ biến | Thường dùng cho các bộ nhớ cache, lưu giữ dữ liệu tạm thời. | Thường dùng trong các cấu trúc dữ liệu như WeakHashMap. |
Ví dụ sử dụng | Cache các đối tượng lớn mà không cần giữ liên tục. | Không giữ đối tượng khi không còn tham chiếu mạnh, ví dụ như WeakHashMap. |
SoftReference
và WeakReference
SoftReference
(Cache)import java.lang.ref.SoftReference;
public class SoftReferenceExample {
public static void main(String[] args) {
SoftReference<byte[]> softCache = new SoftReference<>(new byte[1024 * 1024 * 10]); // 10 MB
if (softCache.get() != null) {
System.out.println("Cache is still available.");
} else {
System.out.println("Cache has been cleared by GC.");
}
}
}
Trong ví dụ này, nếu bộ nhớ hệ thống đủ, đối tượng sẽ được giữ lại và không bị thu gom. Tuy nhiên, nếu JVM thiếu bộ nhớ, đối tượng này sẽ bị thu gom để giải phóng không gian.
WeakReference
(WeakHashMap)import java.lang.ref.WeakReference;
import java.util.HashMap;
import java.util.WeakHashMap;
public class WeakReferenceExample {
public static void main(String[] args) {
WeakReference<String> weakRef = new WeakReference<>(new String("Weak Reference Example"));
System.out.println("Before GC: " + weakRef.get());
System.gc(); // Kích hoạt thu gom rác
System.out.println("After GC: " + weakRef.get());
}
}
Trong ví dụ trên, sau khi thu gom rác, đối tượng được tham chiếu bởi weakRef
sẽ bị thu gom ngay lập tức, và giá trị của weakRef.get()
sẽ là null
.