我对弱引用的理解:一个对象不能被 gc 标记为删除,直到该对象的所有强引用都丢失/删除。这意味着,如果在某个时刻,某个对象仅由弱引用引用,则该对象有资格进行垃圾回收,并且下次 G.C.运行它会将对象标记为删除。
1.我的理解正确吗?
为了验证我的理解,我创建了以下包含两个类的程序。
public class Customer {
private String name;
private String ssnId;
private String phone;
public Customer(String name, String ssnId, String phone) {
this.name = name;
this.phone = phone;
this.ssnId = ssnId;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSsnId() {
return ssnId;
}
public void setSsnId(String ssnId) {
this.ssnId = ssnId;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public String toString()
{
return ssnId + name + phone;
}
}
并且
public class TestClass {
public static void main(String[] args) {
Customer cust = new Customer("ABCD", "001 ", "Phone Number");
WeakReference<Customer> weakcust = new WeakReference<Customer>(cust);
int i = 0;
while(true)
{
if(weakcust.get() != null)
{
i++;
System.out.println(i + " " + weakcust.get());
}
else
{
System.err.println("Object's deleted");
break;
}
}
}
}
从逻辑上讲,这段代码应该继续打印客户的信息。
令我惊讶的是,我发现即使我没有将 cust 引用设置为 null,G.C.正在删除 cust 所指出的对象。一段时间后,程序打印“对象已删除”
2.为什么会发生这种情况?
我相信这可能是因为编译器正在优化代码,并且由于代码中不再使用自定义引用,编译器自行将其设置为 null。 如果我错了,请纠正我。
最佳答案
问题是你的强引用对象 customer 本身除了弱引用(weakcust)之外没有被任何人引用。因此它被标记为垃圾收集。一旦客户被垃圾收集,您就会得到您所看到的行为。
在现实世界的应用程序中,您的客户将在某处被引用,并且只有当其被取消引用时,才会被垃圾收集
关于java - 弱引用、意外对象删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14863014/