繁体   English   中英

是否有可能在java中识别垃圾收集器是否收集了对象?

[英]Is it possible to identify that object is collected by garbage collector or not in java?

我已经读过在下列情况下该对象有资格进行垃圾收集。

  1. 该对象的所有引用都显式设置为null。
  2. 在块内创建对象,并且一旦控制退出该块,引用就会超出范围。
  3. 父对象设置为null,如果对象保存另一个对象的引用,并且当您将容器对象的引用设置为null时,子对象或包含对象将自动符合垃圾回收的条件。

但是,无论如何都要确定垃圾收集器是否收集了符合垃圾收集条件的对象?

对象进行垃圾回收后,JVM会调用其finalize方法。 默认实现什么都不做; 你可以覆盖它,例如,打印告别消息,或关闭一些打开的资源。

但请注意,无法保证收集后的调用时间。

您可以实现Object#finalize()方法

public class Driver {
    public static void main(String[] args) throws Exception {
        garbage();

        System.gc();
        Thread.sleep(1000);
    }

    public static void garbage() {
        Driver collectMe = new Driver();
    }

    @Override
    protected void finalize() {
        System.out.println(Thread.currentThread().getName() + ": See ya, nerds!");
    }
}

打印

Finalizer: See ya, nerds!

所以你可以在收集之前拦截。 javadoc说

finalize的一般契约是,当JavaTM虚拟机确定不再有任何方法可以被任何尚未死亡的线程访问时,它被调用,除非采取了一个行动的结果通过最终确定一些其他准备完成的对象或类。 finalize方法可以采取任何操作,包括使该对象再次可用于其他线程;

但是也

对于任何给定对象,Java虚拟机永远不会多次调用finalize方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM