2013-02-13 65 views
1

我的理解与弱引用:一个对象不能被标记为删除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纠正我。

回答

0

问题是你的强引用对象本身并没有被weakcust引用(这是一个弱引用)。所以它被标记为垃圾收集。一旦客户被垃圾收集,你就会看到你所看到的行为。
在现实世界的应用程序的客户将被引用的地方,只有当其去引用,它会被垃圾收集

+0

谢谢。似乎我的理解是正确的:P – Akg 2013-02-14 06:59:28

0

您没有访问变量cust您分配它weakcust后。 JVM优化注意到你似乎不再需要它,所以它决定在之后放弃它。

把它变成一个静态变量class Main可能会改变这种行为。

+0

谢谢。似乎我的理解是正确的:P. – Akg 2013-02-14 07:00:31