日期:2014-05-20  浏览次数:20642 次

java 对象应用的问题
class   CustomerB{

private   CustomerA     ca;
public   void   SetCustmerA(CustomerA   a)
{
this.ca   =   a;
}

}
class   CustomerA{

private   CustomerB     cb;
public   void   SetCustmerB(CustomerB   a)
{
this.cb   =   a;
}
}

public   class   HelloData   {

public   HelloData()   {
super();
//   TODO   Auto-generated   constructor   stub
}

/**
  *   @param   args
  */
public   static   void   main(String[]   args)   {

CustomerB   B   =   new   CustomerB();
CustomerA   A   =   new   CustomerA();
B.SetCustmerA(A);
A.SetCustmerB(B);
B   =   null;
A   =   null;
}
}

    jvm释放对象所占内存的是根据没有引用引用这个对象,就会将对象释放。
    现在上面的程序,声明了两个类,并且每个类里面都申明了一个引用。
    现在创建了CustomerB   B   =   new   CustomerB();
      CustomerA   A   =   new   CustomerA();
    这样A   B   分别引用这个两个类
    然后执行
                  B.SetCustmerA(A);
A.SetCustmerB(B);
    这样CustomerB   CustomerA中的属性就相互引用对方。
    清除两个引用:
                B   =   null;
              A   =   null;

    虽然A和B引用设为空,但是   a   和   b   原先引用的类里面的属性   相互引用,这样会不会导致CustomerB();CustomerA();永远遗留在内存里面,因为这个两个类的属性引用了对方??

谢谢大虾们的指教   !!!
   
     
   



------解决方案--------------------
垃圾回收器实现了一种火车算法,可以解决这种循环引用的问题.
参见 <深入java虚拟机> 9.9火车算法