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搜集?

 

多谢指点!

0

4个回答

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

[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仍然保持对该实例的引用。

0
chensifeng
chensifeng 解释的很详细,多谢!
接近 7 年之前 回复

[code="java"]at1; bt1; bt2 被GC释放[/code]

0

你的代码有误,我修改下,如下。
[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]

我的答案是

  • 第13行创建的Alpha
  • 第12行创建的Beta

被回收。

至于有争议的

  • 第11行创建的Beta

不会被回收。

因为,它被Alpha的静态类成员变量引用着。

0
j_clxy
clxy大叔 即便at1,at2这两个实例都变为null,仍然可以用 [code="java"] Alpha.b1 [/code] 找到11行创建的实例。
接近 7 年之前 回复
j_clxy
clxy大叔 bt1不会被回收。因为它被Alpha类的静态变量b1引用着。 静态变量跟着类生死,不跟着类的实例生死。
接近 7 年之前 回复
chensifeng
chensifeng 如果13行的at1被收回,那么连着at1的11行的bt1是不是也都回收了?
接近 7 年之前 回复
j_clxy
clxy大叔 12行是我错了。 因为我想接着说 [quote] 即便有 at2 = null; ...... [/quote] 于是,就在脑袋里把at2 = null加了上去。 你说的对,12行不会被回收。 第13行的 at1应该会被回收。 类成员静态变量应该不会影响类实例本身的垃圾回收的。 否则的话,凡是带有静态成员变量的类实例岂不是永远都不会被回收! 所以,应该是只有13行的实例将会被回收掉。
接近 7 年之前 回复
chensifeng
chensifeng 感谢回复。因为有at2.b2 = bt2; 所以第12行一定不会被回收。 至于13行,我个人认为也不会被回收,因为有静态的at1.b1。 不确定的是11行。我认为也不会被回收。所以我个人认为没有被回收的。请大家指教。
接近 7 年之前 回复
j_clxy
clxy大叔 即便有 at2 = null; - 第11行创建的Beta 都不会被回收。
接近 7 年之前 回复

mark

0
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!