当前位置: 代码迷 >> J2SE >> 一道关于内存回收的有关问题
  详细解决方案

一道关于内存回收的有关问题

热度:75   发布时间:2016-04-23 20:01:45.0
一道关于内存回收的问题
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,我有些疑惑,请高手给我解释下。
------解决思路----------------------
Line 5 生成一个局部的对象o
Line 6 把上一句生成的对象o传入doSomethingElse()方法,赋给了属性o
Line 7 又生成一个局部对象o
Line 8 调用doSomethingElse()方法,传入null,使属性o为null,从而使对Line 5生成的局部对象的引用为空,这时就可回收了。
------解决思路----------------------
引用:
我觉得doSomethingElse方法set的是line 2的o,所以line 5创建的o并没有被回收。

line2的o指向了line5的o,所以line5的o暂时不会被回收
------解决思路----------------------
我认为,这种强引用类型,是将引用设为null后,gc会回收;若不设为null,过程过一段时间也会回收。
------解决思路----------------------
强引用如果不撤销引用,对象永远也不会被虚拟机回收
------解决思路----------------------
9行是个废代码,因为创建的对象到8行后,生命周期就结束了。
  相关解决方案