示例代碼如下:
import java.lang.ref.Reference;
import java.lang.ref.ReferenceQueue;
import java.lang.ref.WeakReference;
/**
* @author chenjc
* @since 2020-01-13
*/
public class WeakReferenceTest {
public static void main(String[] args) throws InterruptedException {
User user = new User(1, "debo");
ReferenceQueue<User> userReferenceQueue = new ReferenceQueue<>();
// 建立User對象的弱引用
UserWeakReference userWeakReference = new UserWeakReference(user, userReferenceQueue);
// 去掉強引用
user = null;
System.out.println(userWeakReference.get());
// 手動觸發GC
System.gc();
System.out.println("GC: " + userWeakReference.get());
Reference<? extends User> reference = userReferenceQueue.remove(1000);
if (reference != null) {
UserWeakReference userWeakReference1 = (UserWeakReference) reference;
System.out.println("GC隊列: " + userWeakReference1.getId());
}
}
private static class User {
private Integer id;
private String name;
public User(Integer id, String name) {
this.id = id;
this.name = name;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
'}';
}
}
private static class UserWeakReference extends WeakReference<User> {
private Integer id;
public UserWeakReference(User referent, ReferenceQueue<? super User> q) {
super(referent, q);
this.id = referent.id;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
}
}
輸出如下:
User{id=1, name='debo'}
GC: null
GC隊列: 1
可見,一旦發生GC,弱引用的對象都會被回收。