当我移出范围但仍保留引用时,Java GC会发生什么?

Sam*_*les 3 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 (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);
 }
Run Code Online (Sandbox Code Playgroud)

}

输出:

Obj B: TestObject@525483cd 

Obj B: null

Obj A: TestObject@525483cd

Obj A: TestObject@525483cd
Run Code Online (Sandbox Code Playgroud)

基本上,我在Method test()中创建一个本地对象objectB,并将它的引用分配给Test对象中的变量objectA.

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

现在根据我的理解,我已经有效地将一个指针指向该对象.对象仍然存在,objectA保持唯一的引用.这是否意味着垃圾收集器不会收集在具有窄范围的方法中创建的对象?

如果我找到了对象的指针,我的对象会被收集吗?

对不起,如果这似乎是一个明显的问题,答案我只需要确定我理解我已经阅读过的内容.

Ern*_*ill 5

是的,objectA指向对象使其不被收集.是的,删除最后一个剩余的引用使该对象有资格收集.

重要的是要说"有资格收集"而不是"收集" - 对象可能不会立即收集,或者甚至永远不会,如果JVM再也不需要内存了.