我的理解與弱引用:一個對象不能被標記爲刪除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