一道垃圾回收题,对照着解析后还有三个问题不明白,请恕小弟愚钝
题目:一道垃圾回收题,我自己的理解与解答有出入。
程序段3:
1.Object aobj = new Object ( ) ; //设定由new Object()而产生所分配的内存块为A
2.Object bobj = new Object ( ) ; //设定由new Object()而产生所分配的内存块为B
3.Object cobj = new Object ( ) ; //设定由new Object()而产生所分配的内存块为C
4.aobj = bobj;
5.aobj = cobj;
6.cobj = null;
7.aobj = null;
问:这段代码中,第几行的内存空间符合垃圾收集器的收集标准?
答:第7行。
行1-3分别创建了Object类的三个对象:aobj,bobj,cobj
行4:此时对象aobj的句柄指向bobj,所以该行的执行不能使aobj符合垃圾收集器的收集标准。 //问题一:但我自己认为这时从行4开始内存块A已经没有机会可以再被引用了,所以我认为内存块A此时可以被回收,我自己觉得应该可以选择行4的。请问我这样理解对吗?谢谢。。。。
行5:此时对象aobj的句柄指向cobj,所以该行的执行不能使aobj符合垃圾收集器的收集标准。
行6:此时仍没有任何一个对象符合垃圾收集器的收集标准。
行7:对象cobj符合了垃圾收集器的收集标准,因为cobj的句柄指向单一的地址空间。在第6行的时候,cobj已经被赋值为null,但由cobj同时还指向了aobj(第5行),所以此时cobj并不符合垃圾收集器的收集标准。而在第7行,aobj所指向的地址空间也被赋予了空值null,这就说明了,由cobj所指向的地址空间已经被完全地赋予了空值。所以此时cobj最终符合了垃圾收集器的收集标准。 但对于aobj和bobj,仍然无法判断其是否符合收集标准。
问题二:行4中 aobj = bobj;这个语句可不可以是这样理解的:给对象aobj赋予了新值为bobj,既重新分配了aobj的内存空间为bobj所代表的内存空间。谢谢。。。。
问题三:垃圾回收指的是回收对象的句柄,还是回收对象所代表的内存块呢??
------解决方案--------------------只要 是 没有被引用到的对象 都是符合回收标准
大多数jvm是这么执行回收的:
从堆栈和静态存储区便利所有引用,这时程序先暂停运行
然后将所有别便利过的对象复制到另一个堆
并且重新排列 所以新堆就等于被重新整理了
没被复制的 就是垃圾了
当然这只是回收方式的一种 具体怎么做 取决于jvm
------解决方案--------------------我也选第四行