一道关于内存回收的问题

winky_zhang 2015-01-18 10:31:18
Given:
1. public class GC{
2. private Object o;
3. private void doSomethingElse(Object obj){o = obj;}
4. public void doSomething(){
5. Object o = new Object();
6. doSomethingElse(o);
7. o = new Object();
8. doSomethingElse(null);
9. o = null;
10. }
11. }
When the doSomething method is called, after which line does the Object created in line 5 become available for garbage collection?

选项为:
A. Line 5
B. Line 6
C. Line 7
D. Line 8
E. Line 9
F. Line 10


我个人认为选择E,可是答案给的是D,我有些疑惑,请高手给我解释下。
...全文
309 7 打赏 收藏 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_24300667 2015-01-19
  • 打赏
  • 举报
回复
我认为,这种强引用类型,是将引用设为null后,gc会回收;若不设为null,过程过一段时间也会回收。
wyc_ 2015-01-19
  • 打赏
  • 举报
回复
引用 2 楼 winky_zhang 的回复:
我觉得doSomethingElse方法set的是line 2的o,所以line 5创建的o并没有被回收。
line2的o指向了line5的o,所以line5的o暂时不会被回收
skyhitnow 2015-01-19
  • 打赏
  • 举报
回复
到第七行的时候,第五行创建的对象就只有一个引用了,那就是第二行的o;第八行把第二行的o设置成null,到此,第五行的对象就没有任何引用变量引用了,可以回收了。
自然80 2015-01-19
  • 打赏
  • 举报
回复
9行是个废代码,因为创建的对象到8行后,生命周期就结束了。
树成 2015-01-19
  • 打赏
  • 举报
回复
强引用如果不撤销引用,对象永远也不会被虚拟机回收
winky_zhang 2015-01-18
  • 打赏
  • 举报
回复
我觉得doSomethingElse方法set的是line 2的o,所以line 5创建的o并没有被回收。
anshiny 2015-01-18
  • 打赏
  • 举报
回复
Line 5 生成一个局部的对象o Line 6 把上一句生成的对象o传入doSomethingElse()方法,赋给了属性o Line 7 又生成一个局部对象o Line 8 调用doSomethingElse()方法,传入null,使属性o为null,从而使对Line 5生成的局部对象的引用为空,这时就可回收了。

62,620

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧