我的理解与弱引用:一个对象不能被标记为删除gc,直到对象的所有强引用都被丢失/删除。这意味着如果在某个时候,一个对象只能被弱引用引用,那么该对象有资格进行垃圾回收,下一次G.C.运行它会标记要删除的对象。WeakReferences,意外的对象删除
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指出的对象。并且经过一段时间程序打印出“Object's Deleted”
2.为什么发生这种情况?
我相信这可能是因为编译器正在优化代码,并且由于在代码中不再使用cust参考,编译器将它自己设置为null。 如果我错了,PLZ纠正我。
谢谢。似乎我的理解是正确的:P – Akg 2013-02-14 06:59:28