黑马程序员技术交流社区

标题: 调用System.gc()后 finalize()为什么没有执行 [打印本页]

作者: 张丽丽    时间: 2012-6-10 00:24
标题: 调用System.gc()后 finalize()为什么没有执行
finalize是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,在下面的程序中,为什么finalize()里面的代码没有被执行啊?

public class Systemgc{
        public Systemgc(){  
                System.gc();
        }
        public void finalize(){
                System.out.println("after System.gc() is called");
        }        
         
        public static void main(String [] args){
               
                Systemgc d=new Systemgc();
        }
}
作者: 赵玮_Tom    时间: 2012-6-10 08:28
这个方法应该是不受程序员控制的,JVM会不定期的对垃圾对象进行清理,而何时清理是由JVM内部决定的,即使你调用了gc()方法,也不一定会立即执行。
作者: 孙峰    时间: 2012-6-10 08:44
本帖最后由 孙峰 于 2012-6-10 08:54 编辑

public void finalize(){
                System.out.println("after System.gc() is called");
这个方法是Object 类中的一个方法。 运行时会提示 无法覆盖java.lang.Object中的finalize()方法。
讲此方法名换一个,xx()
然后在 main函数中调用 d.xx(),就执行了
作者: 吴超    时间: 2012-6-10 11:14
本帖最后由 吴超 于 2012-6-10 11:18 编辑

  1. <DIV class=t_fsz>使用finalize方法并不会忙上调用垃圾回收机制,会在不确定的时间对其回收
  2. 如果,你按照下面,将一个对象指向null,那这个对象在堆内存中,就会成为一个垃圾,在调用这个finalize方法,就会强制回收



  3. package com.text;
  4. //观察finalize的调用
  5. public class SystemDemo3 {
  6.         public static void main(String[] args) {
  7.                 Student stu = new Student();
  8.                 stu = null;
  9.                 System.gc();
  10.         }

  11. }

  12. class Student {
  13.         private String name;
  14.         private int age;

  15.         public String getName() {
  16.                 return name;
  17.         }

  18.         public void setName(String name) {
  19.                 this.name = name;
  20.         }

  21.         public int getAge() {
  22.                 return age;
  23.         }

  24.         public void setAge(int age) {
  25.                 this.age = age;
  26.         }

  27.         // 重写toString方法
  28.         public String toString() {
  29.                 return "姓名" + name + "年纪" + age;
  30.         }

  31.         // 自定义finalize() 方法
  32.         public void finalize() {
  33.                 System.out.println(this);
  34.         }

  35. }</DIV>
复制代码





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2