但是thinking in java不是说调用gc方法一定会调用finalize方法么? 可能是我没有理解清楚
真不知道楼主是怎么试的:public class GCTest { private String id; public GCTest(String id) { this.id = id; System.out.println(this + " is created."); } public String toString() { return this.id; } public void finalize() { System.out.println(this + " is garbage collected."); } public static void main(String[] args) { new GCTest("object a"); //or rather: //GCTest a = new GCTest("object a"); //a = null; GCTest b = new GCTest("object b"); System.gc(); } }输出: object a is created. object b is created. object a is garbage collected.因为第一个对象创建以后没被任何变量引用,所以被视为垃圾对象,(用我注释里面的二条语句代替第一句,效果也一样),而第二个对象一直被变量所引用,所以不被视为垃圾对象,GC也就不会去回收它。
可能是我没有理解清楚
private String id;
public GCTest(String id) {
this.id = id;
System.out.println(this + " is created.");
}
public String toString() {
return this.id;
}
public void finalize() {
System.out.println(this + " is garbage collected.");
}
public static void main(String[] args) {
new GCTest("object a");
//or rather:
//GCTest a = new GCTest("object a");
//a = null;
GCTest b = new GCTest("object b");
System.gc();
}
}输出:
object a is created.
object b is created.
object a is garbage collected.因为第一个对象创建以后没被任何变量引用,所以被视为垃圾对象,(用我注释里面的二条语句代替第一句,效果也一样),而第二个对象一直被变量所引用,所以不被视为垃圾对象,GC也就不会去回收它。
程序退出时jvm已经退出,还要垃圾回收干吗!
也就是说很多时候System.gc();不会有任何可见的效果!
finalize()是用来回收垃圾的?!! 晕死!
就用你的程序来说,我多谢了个GCTest test = new GCTest("object a");
然后就不行了为什么呢?
你将对象引用赋给了变量test,而过后没有用test = null来释放其引用,这个对象就一直不是垃圾对象,因此也就不能被gc回收。
而不是用它来召唤垃圾车,立马把他清走。