当前位置:编程学习 > JAVA >>

将引用赋值为空,但System.gc()还是不调用finalize()呢?

求各位大神指点,已将引用撤销,为什么还是打印不出效果?
class Person {
private String name;
private int age;
public Person(String name,int age) {
this.name=name;
this.age=age;
}
public void setName(String name) {
this.name=name;
}
public void setAge(int age) {
this.age=age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
public String toString() {
return "姓名:"+name+this.getName()+",年龄:"+this.getAge();
}
public void finalize() throws Throwable{
System.out.println("我被回收了,我完蛋了...("+this+")");
}
}
public class SystemDemo02 {

public static void main(String[] args) {
Person p=new Person("张三",100);
p=null;
System.gc();
}
--------------------编程问答-------------------- Eclipse跑了下,可以打印出来 --------------------编程问答-------------------- 可是我为什么打印不出来啊 --------------------编程问答-------------------- 简单地说,就算你调用System.gc,也不一定马上GC,一切看jvm心情。它可能啥也不做,也可能释放掉一部分资源,不同版本的JVM可能行为也不一样,根据你给jvm分配的内存不同,行为也不一样。任何依靠finalize方法实现的资源释放都是不可靠的,任何需要调用System.gc的代码都是坏掉的(好吧是绝大部分)。从第一天开始牢记这一点! --------------------编程问答--------------------
引用 3 楼 lcf 的回复:
简单地说,就算你调用System.gc,也不一定马上GC,一切看jvm心情。它可能啥也不做,也可能释放掉一部分资源,不同版本的JVM可能行为也不一样,根据你给jvm分配的内存不同,行为也不一样。任何依靠finalize方法实现的资源释放都是不可靠的,任何需要调用System.gc的代码都是坏掉的(好吧是绝大部分)。从第一天开始牢记这一点!

可是当JVM回收垃圾之前,一定是调用finalize()的,对吗? --------------------编程问答-------------------- 是的,会调用被回收的那个对象的finalize。
补充:Java ,  Java SE
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,