什么';当我移出范围但仍然持有引用时,JavaGC会发生什么情况?

什么';当我移出范围但仍然持有引用时,JavaGC会发生什么情况?,java,garbage-collection,Java,Garbage Collection,基本上,我对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 (InterruptedEx

基本上,我对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);
 }
}

输出:

Obj B: TestObject@525483cd 

Obj B: null

Obj A: TestObject@525483cd

Obj A: TestObject@525483cd
基本上,我在test()方法中创建一个局部对象objectB,并将其引用分配给测试对象中的变量objectA

然后,我将局部变量设置为null,并验证引用是否为null

现在根据我在这里的理解,我已经有效地取消了指向对象的指针。对象仍然存在,objectA保留唯一引用。这是否意味着垃圾收集器将不会收集在范围狭窄的方法中创建的对象

如果我将指向objectA的指针置空,我的对象会被收集吗


很抱歉,如果这似乎是一个带有答案的明显问题,我只需要确保我理解了我已经阅读的内容。

是的,您是对的,如果没有对对象的引用,则该对象有资格进行垃圾收集。更准确地说,如果无法从代码中的引用访问它(例如,3个对象相互引用,但代码中没有引用变量可以访问其中一个对象):

例如:

A->B

B->C

C->A


但是没有对A、B和C的引用=>这三个都符合GC的条件。

是的,使
objectA
指向该对象可以防止它被收集。是的,删除最后一个剩余引用将使对象符合收集条件

重要的是说“makequalifiedforcollection”而不是“iscollected”——对象可能不会立即被收集,或者即使JVM不再需要内存,也可能永远不会被收集