第4行:aobj 、 bobj都指向原来的bobj(以后简称b)所引用的空间,原来aobj(以后简称a)所引用的空间引进没有引用,所以空间a符合垃圾收集器的收集标准第5行:aobj 、 cobj都指向原来的cobj(以后简称c),但aobj指向的空间为b,还有bobj在引用,因此b,c空间都有引用,不符合垃圾收集器的收集标准第6行:将cobj设为空,但空间c仍有aobj引用,因此也不符合第7行:将cobj设为空,空间c以无引用,空间c符合垃圾收集器的收集标准最终答案:第4和第7行
调试欢乐多
jia0(佳)分析对
| JVM |
_________________________________ | | |
aobj bobj cobj4.aobj = bobj; ---------------------------------
| JVM |
_________________________________ | |
aobj -- bobj cobj5.aobj = cobj; ---------------------------------
| JVM |
_________________________________ | |
aobj -- cobj bobj6.cobj = null;---------------------------------
| JVM |
_________________________________ |
aobj -- cobj bobj到6就符合GC垃圾收集的要去了吧,收集的时候aobj和cobj会一并...
String obj;
public TestGc(String obj){
this.obj = obj;
}
public static void main(String[] args){
TestGc aobj = new TestGc ("aobj"); TestGc bobj = new TestGc ("bobj"); TestGc cobj = new TestGc ("cobj"); aobj = bobj; aobj = cobj; cobj = null; aobj = null; System.gc();
}
public void finalize(){
System.out.println(obj+" 被回收 ");
}
} 运行结果:
aobj 被回收
cobj 被回收
第4行:aobj 、 bobj都指向原来的bobj(以后简称b)所引用的空间,原来aobj(以后简称a)所引用的空间引进没有引用,所以空间a符合垃圾收集器的收集标准第5行:aobj 、 cobj都指向原来的cobj(以后简称c),但aobj指向的空间为b,还有bobj在引用,因此b,c空间都有引用,不符合垃圾收集器的收集标准第6行:将cobj设为空,但空间c仍有aobj引用,因此也不符合第7行:将cobj设为空,空间c以无引用,空间c符合垃圾收集器的收集标准最终答案:第4和第7行
”
在第4行时原来aobj刚开始引用的空间a符合,在第7行时原来cobj刚开始引用的空间c符合!呵呵!顺便说一句,什么时候结题给分呢?我说的应该是正确答案阿!
行1-3分别创建了Object类的三个对象:aobj,bobj,cobj
行4:此时对象aobj的句柄指向bobj,所以该行的执行不能使aobj符合垃圾收集器的收集标准。
行5:此时对象aobj的句柄指向cobj,所以该行的执行不能使aobj符合垃圾收集器的收集标准。
行6:此时仍没有任何一个对象符合垃圾收集器的收集标准。
行7:对象cobj符合了垃圾收集器的收集标准,因为cobj的句柄指向单一的地址空间。在第6行的时候,cobj已经被赋值为null,但由cobj同时还指向了aobj(第5行),所以此时cobj并不符合垃圾收集器的收集标准。而在第7行,aobj所指向的地址空间也被赋予了空值null,这就说明了,由cobj所指向的地址空间已经被完全地赋予了空值。所以此时cobj最终符合了垃圾收集器的收集标准。 但对于aobj和bobj,仍然无法判断其是否符合收集标准。
总之,在Java语言中,判断一块内存空间是否符合垃圾收集器收集标准的标准只有两个:
1.给对象赋予了空值null,以下再没有调用过。
2.给对象赋予了新值,既重新分配了内存空间。
最后再次提醒一下,一块内存空间符合了垃圾收集器的收集标准,并不意味着这块内存空间就一定会被垃圾收集器收集。
回收的条件就是对象没有被引用。我讲了两年的java了都这么讲的
同jia0(佳)的分析
正确答案:4 ,7
回收的条件就是对象没有被引用。我讲了两年的java了都这么讲的你这样讲是不完整的。在java中符合垃圾回收的有好几种情况。其中最常见的是:
1、没有任何引用指向的对象;
2、互相指向的两个引用变量,也叫做“隔离岛”,英文原文我忘了。总之,在分析此类问题时,请大家在纸上画个对象图,一个引用变量。这样指来指去,很容易就看出什么时候,哪个对象可以被GC回收了。
>>总之,在Java语言中,判断一块内存空间是否符合垃圾收集器收集标准的标准只有两个:
>>1.给对象赋予了空值null,以下再没有调用过。
>>2.给对象赋予了新值,既重新分配了内存空间。第4行怎么会不符合垃圾收集器收集标准2呢???
1) Methods cannot be overriden to be more private
2) Static methods cannot be overloaded
3) Private methods cannot be overloaded
4) An overloaded method cannot throw exceptions not checked
in the base class
但jvm不知怎么实现的!
http://community.csdn.net/Expert/topic/3472/3472604.xml