当前位置: 技术问答>java相关
scjp题,帮忙解释一下为什么?
来源: 互联网 发布时间:2015-08-21
本文导语: 9. 1)public class X{ 2) public Object m(){ 3) Object o=new Float(3.14F); 4) Object[] oa=new Object[1]; 5) oa[0]=o; 6) o=null; 7) oa[0]=null; System.out.println(oa[0]); 9) } 10) } which line is the earliest point the objec...
9. 1)public class X{
2) public Object m(){
3) Object o=new Float(3.14F);
4) Object[] oa=new Object[1];
5) oa[0]=o;
6) o=null;
7) oa[0]=null;
System.out.println(oa[0]);
9) }
10) }
which line is the earliest point the object a refered is definitely elibile
to be garbage collectioned?
A.After line 4 B. After line 5 C.After line 6
D.After line 7 E.After line 9(that is,as the method returns)
Answer:D
2) public Object m(){
3) Object o=new Float(3.14F);
4) Object[] oa=new Object[1];
5) oa[0]=o;
6) o=null;
7) oa[0]=null;
System.out.println(oa[0]);
9) }
10) }
which line is the earliest point the object a refered is definitely elibile
to be garbage collectioned?
A.After line 4 B. After line 5 C.After line 6
D.After line 7 E.After line 9(that is,as the method returns)
Answer:D
|
只有new 才分配内存,所谓的垃圾收集(garbage collection)也就是指收回这些内存,条件是这内存没有被任何其它程序代码所利用了。
这道题,答案正确。
o 先被分配了内存,是一个Float大小的内存块; oa 被分配了内存,是一个Object大小的内存块(就是oa[0]).
第5行,可以把oa[0]当作指针,指向 o 代表的那个Float。现在有两个代码指向那个Float内存, o 和 oa[0].
第6行, o 不再指向Float 内存了。
第7行 oa[0]也不指向那个Float内存了,所以第7行后(理论上) 垃圾收集就起作用了。
另外,上面代码有问题,编译肯定不通过,因为函数m()应该有返回值。
这道题,答案正确。
o 先被分配了内存,是一个Float大小的内存块; oa 被分配了内存,是一个Object大小的内存块(就是oa[0]).
第5行,可以把oa[0]当作指针,指向 o 代表的那个Float。现在有两个代码指向那个Float内存, o 和 oa[0].
第6行, o 不再指向Float 内存了。
第7行 oa[0]也不指向那个Float内存了,所以第7行后(理论上) 垃圾收集就起作用了。
另外,上面代码有问题,编译肯定不通过,因为函数m()应该有返回值。
|
第5行oa[0]=0;这样第3行创建的对象被两个引用指向。所以只有当两个引用都指向null之后才会被gc。也就是第7行。
你这题什么地方看到的?跟我考scjp的那道gc题很象的嘛。
你这题什么地方看到的?跟我考scjp的那道gc题很象的嘛。
|
因為o=null後面的程序沒有使用到變量o,所以最先回收。
|
o=null后,自然会被收集了!