chensifeng 2012-08-08 16:55
浏览 337
已采纳

Garbage Collection问题

class Beta {}  
class Alpha {  
static Beta b1;  
Beta b2;  
}  
public class Tester {  
public static void main(String [] args){  
Beta bt1 = new Beta();        Beta bt2 = new Beta();  
Alpha at1 = new Alpha();     Alpha at2 = new Alpha();  
at1.b1 = b1;  
at1.b2 = b1;  
at2.b2 = b2;  
at1 = null;  bt1 = null;  bt2 = null;   
  //do stuff  
}

请问到了第14行有哪些对象有资格被GC搜集?

 

多谢指点!

  • 写回答

4条回答

  • clxy大叔 2012-08-10 15:36
    关注

    总结下,希望这次不要再有错误了,哈。

    [code="java"]
    class Beta {
    }

    class Alpha {
    static Beta b1;
    Beta b2;
    }

    public class Tester {
    public static void main(String[] args) {
    Beta bt1 = new Beta();
    Beta bt2 = new Beta();
    Alpha at1 = new Alpha();
    Alpha at2 = new Alpha();
    at1.b1 = bt1;
    at1.b2 = bt1;
    at2.b2 = bt2;
    at1 = null;
    bt1 = null;
    bt2 = null;
    // do stuff
    }
    }[/code]

    问:在第21行,有哪些实例将会被GC回收?
    答:

    • 18行的at1 = null,会导致13行创建的实例将会被回收。
      因为再没有对这个实例的引用。

    • 19行的bt1 = null,不会导致11行创建的实例被回收。
      因为11行的实例仍然被Alpha这个类的静态变量引用着。
      (该静态变量生活在Alpha的Class的实例中,该实例直到Alpha类被jvm卸载——基本上永远不会发生——时才会消失。网上有根据编译后的class中分析出,静态变量和常量放在一起的。)

    • 20行的bt2 = null,不会导致12行创建的实例被回收。
      因为at2的b2仍然保持对该实例的引用。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

悬赏问题

  • ¥20 matlab计算中误差
  • ¥15 对于相关问题的求解与代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 信号傅里叶变换在matlab上遇到的小问题请求帮助
  • ¥15 保护模式-系统加载-段寄存器
  • ¥15 电脑桌面设定一个区域禁止鼠标操作
  • ¥15 求NPF226060磁芯的详细资料
  • ¥15 使用R语言marginaleffects包进行边际效应图绘制
  • ¥20 usb设备兼容性问题
  • ¥15 错误(10048): “调用exui内部功能”库命令的参数“参数4”不能接受空数据。怎么解决啊