簡體   English   中英

當我搬出 scope 但仍然持有參考時,Java GC 發生了什么?

[英]What's happening with the Java GC when I move out of scope but still hold a reference?

基本上我對 Java 還很陌生,我正在努力解決以下問題。

public class Test {

TestObject objectA;

 public static void main(String args[])
 {
     Test t = new Test();
     t.test();
     while (true){
         try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {}
         System.out.println("Obj A: " + t.objectA.toString()); 
     }
 }

 void test(){
     Object objectB = new TestObject(1, 1);

     objectA = (TestObject)objectB;
     System.out.println("Obj B: " + objectB);

     objectB = null;     System.out.println("Obj B: " + objectB);
 }

}

Output:

Obj B: TestObject@525483cd 

Obj B: null

Obj A: TestObject@525483cd

Obj A: TestObject@525483cd

基本上,我在方法 test() 中創建了一個本地 object objectB 並將其分配給 Test object 中的變量 objectA 的引用。

然后我將局部變量設置為 null 並驗證引用已被清空。

現在根據我的理解,我剛剛有效地將指向 object 的指針設為空。 object 仍然存在,objectA 持有唯一的引用。 這是否意味着垃圾收集器不會收集以窄 scope 的方法創建的 object?

如果我將指向 objectA 的指針設為空,我的 object 會被收集嗎?

抱歉,如果這似乎是一個帶有答案的明顯問題,我只需要確保我理解我已經閱讀的內容。

是的,使objectA指向 object 可以防止它被收集。 是的,刪除最后一個剩余的引用使 object 符合收集條件。

重要的是說“符合收集條件”而不是“被收集”——object 可能不會立即被收集,或者如果 JVM 不再需要 ZCD69B4957F06CD818D7BF3D6198E 則可能永遠不會被收集。

是的,你是對的,如果沒有引用 object,它就有資格進行垃圾收集。 更准確地說,如果無法從代碼中的引用訪問它(例如 3 個對象相互引用,但代碼中沒有引用變量可以訪問其中之一):

例如:

A -> B

B -> C

C -> A

但沒有提及 A、B 和 C => 這三個都有資格獲得 GC。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM