什麼時候一個物件可以被垃圾回收?


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

更新於: 2020-06-29

2K+ 瀏覽量

開啟你的 職業生涯

透過完成課程獲得認證

開始學習
廣告