我在一篇文章里看见一题有关垃圾收集的文件,其中他举了个例子,我不是很明白,希望
清楚的哥们告知下:
题目: 程序段:
[code="java"]Object a = new Object(); //---------1
Object a = null; //---------2
Object b = new Object(); //---------3
b = new Object(); //---------4
[/code]
[b]问: 在这几行代码中,第几行内存空间符合垃圾收集器的收集标准?为什么?[/b]
参考答案: 1和3。 第4行相当于为b赋值为null。 不明白什么意思。
参考文章: [url]http://www.360doc.com/content/10/0822/18/1780254_47975944.shtml[/url]
顺便推荐一些好的有关垃圾收集的文件来看看,谢谢!
当用new 他建对象时,会在内存堆中分配空间。
而我们定义的变量就是指向这些空间的引用,比如说:
Object a = new Object();
new Object()会在内存堆分配空间,而a是指向该空间的引用,
所谓的垃圾回收就是收回由 new 在内存堆中分配的空间。
那么什么时候情况下堆中的内存空间可以被回收呢?
即当再也没有引用变量指向该空间时,则可以被收回。比如:
1.Object a = new Object(); //---------1
2. Object a = null; //---------2
3. Object b = new Object(); //---------3
4. b = new Object(); //---------4
上面,在内存堆上先后伸请了三个空间块,即三个new开避的,
很显然1,和3的空间已无引用变量指向,
而第4句话中的空间有引用b指向,
故是1,3满足条件.
第4行的b赋值了新的引用,也就是说3行的b所引用的object对象没有被其它的对象所引用,就满足了垃圾回收条件,我是这么理解的。
Object aobj = new Object ( ) ;
Object bobj = new Object ( ) ;
Object cobj = new Object ( ) ;
aobj = bobj;
aobj = cobj;
cobj = null;
aobj = null;
当aobj=bobj时,aobj原引用对象满足回收条件,此时bobj所引用的对象同时被bobj和aobj引用。
当aobj=cobj时,aobj变为cobj所引用的对象,而bobj原对象的引用变为只有bobj引用,cobj对象此时被cobj和aobj引用
cobj=null时,cobj引用的对象变为aobj引用。
aobj=null时,aobj所引用的对象满足回收条件。
最后应该只有bobj引用的对象没被回收