2013-02-13 41 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