为什么敲定不会被调用?为什么敲定不会被调用?(Why is finalize not being c

2019-05-12 05:53发布

我有几个关于Java垃圾收集器的问题。

Q1.As据我了解,最后确定()当对象超出范围,JVM即将收集的垃圾被调用。 我想finalize()方法是由垃圾收集器会自动调用,但它似乎并不在这种情况下工作。 是什么解释? 为什么对我来说是显式调用finalize()方法的需要?

public class MultipleConstruct {
    int x,y;    
    public MultipleConstruct(int x)
    {
        this.x= x;
        y=5;        
        System.out.println("ONE");
    }

    @Override
    protected void finalize() throws Throwable {
        // TODO Auto-generated method stub
        super.finalize();
        System.out.println("FINALIZED");
    }
    public static void main(String[] args) throws Throwable {
        MultipleConstruct construct = new MultipleConstruct(3);
    }
}

Q2。 此外,当垃圾收集器调用? 我明白gc为守护线程和由JVM视剩余堆大小调用。 这是否意味着,JVM等待程序使用资源的门槛限制,然后通知GC扫垃圾对象。

编辑:如何解决GC循环引用?

Answer 1:

有很多finalize()方法是坦然了很多写的,但在短期:

一个目的是在完成的状态,如果它仍然是它的finalize方法后无法访问,如果有的话,一直跑。 结束写入对象正在等待释放。 需要注意的是虚拟机实现控制运行终结的时候。 你几乎总是更好做自己的清除,而不是依赖一个终结。 使用终结也可以离开,不会被回收的一个不确定的时间关键资源落后。

在你的情况下,它不打印的原因是,你不知道什么时候终结器线程将调用finalize()方法。 正在发生的事情是,程序终止可以得到打印任何东西之前。 要检查:通过编辑主代码里面的代码(注意:这不guarrantee也不应该你应该永远依靠它,但仍然它打印一些时间)

for(int i =0;i<1000000;i++)
    {
        MultipleConstruct construct = new MultipleConstruct(3);
        construct = null;
    }

有很多使用的finalize()直接从花更多的时间在对象的构造内存泄漏和内存饥饿的可能性的缺点。 如果你强烈地指向同一个对象的finalize()内,然后它从未被称为第二时间,从而可以在不希望的状态等等等休假制度......,你应该使用的finalize()只有一个地方是安全网处置的任何资源一样的InputStream使用它来关闭(这又没有guarrantee它将将就BR运行时,你的程序还活着)。 同时利用当地人在那里的垃圾收集器无法控制使用它的另一个地方是。

欲了解更多信息,请访问:

http://jatinpuri.com/?p=106



Answer 2:

Q1)finalize方法被调用的对象被垃圾收集时,因此,如果没有正在执行GC,则你的终结可以不被调用。 你需要超级简单地调用保存的对象实施提供行为。

Q2)在其中进行GC的确切时间取决于很多的因素一样:哪个JVM使用的是,调整参数,免费堆等的量,它不仅依赖于使用的堆阈值。 您也可以要求GC通过System.gc()的进行,但你不知道是否以及何时会被实际执行的保证。 你可以找到关于如何配置GC一些细节http://java.sun.com/performance/reference/whitepapers/tuning.html



Answer 3:

它得到最终还是没有被调用

基本GC扫描堆为不可达,并运行在那些终结器(在这之后需要再次证明它是无法到达它会被释放)一切

但它可能需要一段时间(实际上是未定义的,实际上依赖于程序的行为)的GC找到它这就是为什么你真的不应该依靠它来处理关键数据

编辑:作为用于循环引用将其与finalize方法的对象和对象之间的区别在没有一个

用于被释放的对象(从主存储器中删除)它可能不是由任何代码到达(这包括该静止需要运行终结)

当两个物体与终结有资格得到终结运行GC任意选择一个对象,并运行在它的终结,然后就可以运行其他对象

注意,终结可以运行,而对象的字段可能或可能不会完成已



Answer 4:

finalize()方法是在垃圾回收过程自动调用。 System.gc()的方法强制调用垃圾收集器。 但我们将收到破坏的对象。 例:

     public class Sample 
{
    public Sample()
    {
        System.out.println("Object created");
    }
    @Override
    public void finalize()
    {
        System.out.println("Object Destroyed");
    }
    public static void main(String args[])
    {
        Sample x=new Sample();
        Sample y=new Sample();

        x=null;
        y=null;

        System.gc();
    }
}


文章来源: Why is finalize not being called?