看板java
标 题Re: [问题] 请教一道GC题目
发信站老鼠的香香乳酪洞 (Fri Mar 16 03:50:06 2007)
转信站ptt!ctu-reader!ctu-peer!news.nctu!news.cis.nctu!Mouse
※ 引述《[email protected] (as simple as possible)》之铭言:
: ※ 引述《gp20 ()》之铭言:
: : public class GC {
: : private Object o ;
: : private void dosomethingElse(Object obj){o = obj ; }
: : public void dosomething() {
: : Object o = new Object() ;//第5行
: : dosomethingElse(o) ;//第6行
: : o = new Object() ;//第7行
: : dosomethingElse(null) ;//第8行
: : o = null ;//第9行
: : }//第10行
: : }
: : When doSomething method is called, after which line does Object created in
: : line 5 become available for garbage collection ?
: : 书中给的答案是,第7行後第五行被created的Object才可以被GC
: : 但是我觉得是第8行耶
: : 因为到第7行的时候产生的Object仍然被GC内的成员o所reference
: : 应该要到第8行让它也指向null後,之前产生的Object才能被GC
: : 不知道板友们的看法是?
: : 谢谢唷…
: 第五行所产生的Object只被 o 所 reference
: 第七行把 o reference 到另外一个Object
: 如此一来第五行所产生的Object就没有被reference到
: 所以就可以被GC了
随然是讨论 但是如果自己没先稍微确定一下就回文
是蛮有可能误导别人的
这问题 有台电脑 装了java 就可以试出来了
提供简单的方法: 把这问题里面的new Object()改成new ABC("a name")
class ABC{
String name;
public ABC(String n) {name = n;}
protected void finalize() throws Throwable {
System.out.println("GC: " + name);
}
}
在dosomething()里面每行statement後面加上System.gc();
1.把第8行和第9行注解起来, 然後编译并执行 ==> 在程式结束前, 没人被GC
2.只注解第9行, 然後编译并执行 ==> 第5行建立的物件被GC,
3.只注解第8行, 然後编译并执行 ==> 第7行建立的物件被GC,
4.不注解任何行, 然後编译并执行 ==> 第5行的物件先被GC, 然後是第7行的物件被GC
结论:
执行第8行可让第5行的物件被GC
执行第9行可让第7行的物件被GC
--
※Post by leon from 59-115-236-130.dynamic.h
老鼠的香香乳酪洞˙电子布告栏系统˙alexbbs.twbbs.org˙140.113.166.7