没有java程序运行时垃圾收集器会运行吗?

时间:2018-04-04 17:39:51

标签: java garbage-collection finalize

finalize的文档说

  

垃圾收集时由垃圾收集器调用对象   确定没有对该对象的更多引用。一个子类   覆盖最终化方法来处理系统资源或   进行其他清理。

所以我假设一旦程序执行结束,将在对象上调用finalize方法。

public final class MainClass{


    public static void main(String[] args) {
        A s = new A(5);
        s = new A(6);
        System.out.println(s);

        System.out.println("End of main");
    }

}
final class A{

    private int value;

    public A(int value) {
        this.value = value;
    }

    @Override
    protected void finalize() throws Throwable {

        System.out.println("Destroyed object is :"+this);
        System.out.println("Inside finalize");
        super.finalize();
    }       

    @Override
    public String toString() {
        return ((Integer)value).toString();
    }
}

程序的输出是

6
End of main

使用new A(6)初始化System.gc()之后,运行finalize方法,垃圾收集器删除值为5的对象,输出将为

6
Destroyed object is :5
Inside finalize
End of main

我已经读过,一旦程序结束,操作系统将清理内存,因此在程序运行时不需要进行垃圾回收。

所以我有三个问题,

  1. 使用类型A()的对象调用finalize方法是垃圾收集?如果是,那么为什么现在不调用它?如果不是,那么它将被调用?
  2. 每次对象被垃圾回收时都会调用finalize()方法吗?
  3. 如果在程序运行时没有发生垃圾收集,那么在程序完成后很久就会有一个jvm进程触发垃圾回收吗?
  4. 注意:在我的情况下,调用垃圾收集器是因为程序中不再引用new A(5)

    编辑:

    解释为什么这个问题不同:

    这个问题更多的是关于将finalize()方法始终在垃圾收集上调用,并且可以在不调用finalize()方法的情况下进行垃圾收集。

    此问题尚未提出,如果有,则StackOverflow无法解答此类问题。

0 个答案:

没有答案