什麼時候一個物件可以被垃圾回收?
Java 垃圾回收器跟蹤活動物件,並且不再需要的物件會被標記為垃圾回收。它使開發人員不必考慮記憶體分配/釋放問題。
當在 Java 程式中建立的物件不再可達或使用時,它就可以被垃圾回收。
以下是一些 Java 物件可能無法訪問/未使用的情況。
方法內部的物件 − 在 Java 中,方法儲存在棧記憶體中。當您呼叫一個方法時,JVM 將其提取到棧中並執行它。執行完成後,它將從棧中彈出,然後其所有變數都將被丟棄。
因此,當您在方法中建立物件時,在方法執行完成後,此物件將變得不可訪問。
示例
public class Sample { String name; Sample(String name){ this.name = name; } public static void sampleMethod(){ Sample obj1 = new Sample("myObject2"); Sample obj = new Sample("myObject1"); } protected void finalize() throws Throwable { System.out.println(this.name + " successfully garbage collected"); } public static void main(String args[]){ sampleMethod(); System.gc(); } }
輸出
myObject1 successfully garbage collected myObject2 successfully garbage collected
重新賦值 − 當您將一個值(另一個物件)重新賦值給現有的引用變數時,原始物件最終將變得不可訪問。
示例
public class Sample { String name; Sample(String name){ this.name = name; } protected void finalize() throws Throwable { System.out.println(this.name + " successfully garbage collected"); } public static void main(String args[]){ Sample obj = new Sample("myObject1"); obj = new Sample("myObject2"); System.gc(); } }
輸出
myObject1 successfully garbage collected
賦值為 null − 當您將 null 值賦值給物件的引用時,它將不再可訪問。
示例
public class Sample { String name; Sample(String name){ this.name = name; } protected void finalize() throws Throwable { System.out.println(this.name + " successfully garbage collected"); } public static void main(String args[]){ Sample obj = new Sample("myObject1"); obj = null; System.gc(); } }
輸出
myObject1 successfully garbage collected
匿名物件 − 實際上,匿名物件的引用不會儲存在任何地方,因此在第一次執行後您無法再次呼叫它,因此它不可訪問。
示例
public class Sample { String name; Sample(String name){ this.name = name; } public void sampleMethod(){ System.out.println("This is a sample method"); } protected void finalize() throws Throwable { System.out.println(this.name + " successfully garbage collected"); } public static void main(String args[]){ new Sample("object1").sampleMethod(); System.gc(); } }
輸出
This is a sample method object1 successfully garbage collected
廣告