看板java
标 题Re: [重编] 谈谈 Java 语言的垃圾收集器
发信站老鼠的香香乳酪洞 (Fri Aug 11 23:47:38 2006)
转信站ptt!ctu-reader!Spring!news.nctu!news.ntu!news.ee.ttu!news.cis.nctu!Mou
※ 引述《[email protected] (痞子军团团长)》之铭言:
: 程式段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 符
: 合垃圾收集器的收集标准。
错的, 此时aobj原来的instance已经没人存取得到了, 所以会被gc掉
经程式验证过, 如下: (为方便大家复制贴上, 刻意压缩行数, 排版较难看些)
public class T {
String name;
public T(String n) { name = n; }
protected void finalize() { System.out.println (name + " was GCed."); }
public static void main(String args[]) {
T a = new T("a");
System.out.println ("line 1: "); System.gc();
T b = new T("b");
System.out.println ("line 2: "); System.gc();
T c = new T("c");
System.out.println ("line 3: "); System.gc();
a = b;
System.out.println ("line 4: "); System.gc();
a = c;
System.out.println ("line 5: "); System.gc();
c = null;
System.out.println ("line 6: "); System.gc();
a = null;
System.out.println ("line 7: "); System.gc();
}
}
执行结果:
line 1:
line 2:
line 3:
line 4:
a was GCed.
line 5:
line 6:
line 7:
c was GCed.
: 行 5:此时对象 aobj 的句柄指向 cobj,所以该行的执行不能使 aobj 符
: 合垃圾收集器的收集标准。
: 行 6:此时仍没有任何一个对象符合垃圾收集器的收集标准。
: 行 7:对象 cobj 符合了垃圾收集器的收集标准,因为 cobj 的句柄指向单
: 一的地址空间。在第 6 行的时候,cobj 已经被赋值为 null,但由 cobj 同时
: 还指向了 aobj(第 5 行),所以此时 cobj 并不符合垃圾收集器的收集标准。
: 而在第 7 行,aobj 所指向的地址空间也被赋予了空值 null,这就说明了,由
: cobj 所指向的地址空间已经被完全地赋予了空值。所以此时 cobj 最终符合了
: 垃圾收集器的收集标准。但对於 aobj 和 bobj,仍然无法判断其是否符合收集
: 标准。
--
※Post by leon from 59-115-227-228.dynamic.h
老鼠的香香乳酪洞˙电子布告栏系统˙alexbbs.twbbs.org˙140.113.166.7