java中的垃圾收集示例?

MKo*_*Kod 4 java garbage-collection

class Beta { }

class Alpha {
static Beta b1  ;
Beta b2;
}

public class Tester {

public static void main(String[] args) {

    Beta b1 = new Beta();
    Beta b2 = new Beta();
    Alpha a1 = new Alpha();
    Alpha a2 = new Alpha();

    a1.b1 = b1 ;
    a1.b2 = b1 ;
    a2.b2 = b2 ;

    a1 = null ;
    b1 = null;
    b2 = null;

    System.out.println(" Line 1    " + " a1   "  + a1.b1);
    System.out.println(" Line 2    " + " a1   "  + a1.b2);
    System.out.println(" Line 3    " + " a2   " + a2.b2);
    System.out.println(" Line 4    " + " a1   " + a2.b1);
    System.out.println(" Line 5    " + " b1   " + b1);
    System.out.println(" Line 6    " + " b1   " + b2);

  }

 }  
Run Code Online (Sandbox Code Playgroud)

我不确定为什么在上面的程序中只有a1对象可用于垃圾收集.我期待垃圾收集器收集a1,b1和b2.

正如您所看到的那样,a1,b1和b2被设为NULL,因此这使得对象可用于垃圾收集.如果对象为NULL或任何线程或引用变量无法访问,则应由垃圾收集器收集.

有人可以用更好的例子和更精确的方式帮助我理解上述程序的微妙之处吗?非常感谢您的帮助.

kos*_*osa 7

因为由于下面的线条,b1和b2引用所指向的对象仍然存在参考.

a1.b1 = b1 ;
a1.b2 = b1 ;
a2.b2 = b2 ;
Run Code Online (Sandbox Code Playgroud)

假设是这样的:

  b1--->BetaObj1
    b2---BetaObj2
    a1---> AlphaObj1
    a2---> AlphaObj2
Run Code Online (Sandbox Code Playgroud)

a1b1指向b1,这意味着,有对BetaObj1 a1.b2的引用指向b1,这意味着,还有对BetaObj1的另一个引用

(此时有3个对BetaObj1的引用)

a2.b2指向b2,这意味着,有对BetaOBj2的引用

(此时有2个对BetaObj2的引用)

a1=null; 使AlphaObj1符合GC的条件

b1=null; 使BetaObj1引用计数为2,因此该对象不适用于GC

b2=null; 使BetaObj2引用计数为1,因此该对象不适用于GC.