一個關於JAVA GC的小實驗

bluetooth發表於2021-09-09

關於JAVA的GC,我只是略微瞭解,我知道如果一個物件沒有其他東西引用它,它就會在適當的時機被回收掉。

但,如果一個A物件持有B物件的引用,後對A物件的引用被置為null,那麼B物件還會被回收嗎?如果B被回收,那麼順序是怎麼樣的?是A先,還是B先?

就讓我們來實踐一下:

建立兩個類:

public class MyObject {

   private MyObject1 myObject1 = new MyObject1();

   @Override
   protected void finalize() throws Throwable {
       System.err.println("my object  gc");
   }
}
public class MyObject1 {

   @Override
   protected void finalize() throws Throwable {
       System.err.println("my object 1 gc");
   }
}

需要說明的是:finalize不一定會在物件被回收前被呼叫。

Main類:

public class Main {

   public static void main(String[] args) {
       MyObject myObject =new MyObject();
       myObject = null;

       System.gc();

       try {
           Thread.sleep(5000);
       } catch (InterruptedException e) {
           e.printStackTrace();
       }

   }
}

需要說明的是:System.gc()只是建議虛擬機器進行垃圾回收,但具體是由虛擬機器自己去決定的,這裡我使用的是Java HotSpot(TM) 64-Bit Server VM 18.9。

不同的虛擬機器實現不同,可能會有不一樣的結果。

好的,讓我們來執行一下:

my object 1 gc
my object  gc

Process finished with exit code 0

首先是object1被回收,然後object才被回收。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/3402/viewspace-2817794/,如需轉載,請註明出處,否則將追究法律責任。

相關文章