关于垃圾收集器的几个问题?有兴趣的兄弟姐妹来看看!

huozhe 2001-11-02 09:46:41
程序段1:
1.fobj = new Object ( ) ;
2.fobj. Method ( ) ;
3.fobj = new Object ( ) ;
4.fobj. Method ( ) ;
问:这段代码中,第几行的fobj 符合垃圾收集器的收集标准?
答:第3行。因为第3行的fobj被赋了新值,产生了一个新的对象,即换了一块新的内存空间,也相当于为第1行中的fobj赋了null值。这种类型的题在认证0考试中是最简单的。

2、程序段2:
1.Object sobj = new Object ( ) ;
2.Object sobj = null ;
3.Object sobj = new Object ( ) ;
4.sobj = new Object ( ) ;
问:这段代码中,第几行的内存空间符合垃圾收集器的收集标准?
答:第1行和第3行。因为第2行为sobj赋值为null,所以在此第1行的sobj符合垃圾收集器的收集标准。而第4行相当于为sobj赋值为null,所以在此第3行的sobj也符合垃圾收集器的收集标准。
如果有一个对象的句柄a,且你把a作为某个构造器的参数,即 new Constructor ( a )的时候,即使你给a赋值为null,a也不符合垃圾收集器的收集标准。直到由上面构造器构造的新对象被赋空值时,a才可以被垃圾收集器收集。

程序段3:
1.Object aobj = new Object ( ) ;
2.Object bobj = new Object ( ) ;
3.Object cobj = new Object ( ) ;
4.aobj = bobj;
5.aobj = cobj;
6.cobj = null;
7.aobj = null;
问:这段代码中,第几行的内存空间符合垃圾收集器的收集标准?
答:第7行。注意这类题型是认证考试中可能遇到的最难题型了。

行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,仍然无法判断其是否符合收集标准。


我现在的问题是:程序段1中,我觉的符合垃圾收集器的标准应该是第一行,因为fobj在第三行赋予了新值;程序段3中,为什么第六行不对。
...全文
99 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
wwangl 2001-11-02
  • 打赏
  • 举报
回复
aobj=bobj;是将bobj的句柄赋给aobj的对象,同样第五行将cobj的句柄赋给bobj的对象。
想想,如果第六行产生垃圾回收,为什么不在第四行产生!
wwangl 2001-11-02
  • 打赏
  • 举报
回复
程序段3中,第四条语句并没有覆盖aobj对其对象的引用,而是将指向bobj的指针赋给aobj所指向的对象。
hyhong_h 2001-11-02
  • 打赏
  • 举报
回复
程序段3中,我认为答案应该是4和7。

因为程序执行到第四行时,已经没有任何一个引用指向第一行生成的对象了。
cherami 2001-11-02
  • 打赏
  • 举报
回复
垃圾收集的标准是不再存在对该对象的引用。
程序3中的第六行的赋值不符合是因为第五行的赋值使aobj和cobj指向同一对象,对cobj的赋值为null不会影响aobj对该对象的引用,只有存在一个对该对象的引用就不会进行对该对象的垃圾收集。
程序1中你的说明中已经很清楚了。哪有一个对象在第一次被初始化时就符合垃圾收集的?

62,615

社区成员

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

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