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

时间:2013-12-11 19:32:34

标签: java garbage-collection

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

  1. 该对象的所有引用都显式设置为null。
  2. 在块内创建对象,引用超出范围 一旦控制退出阻止。
  3. 如果对象包含另一个对象的引用,则将父对象设置为null 对象以及当您设置容器对象的引用null,child或 包含的对象自动成为垃圾的资格 集合。
  4. 但是,无论如何要确定垃圾收集器是否收集了符合垃圾收集条件的对象?

2 个答案:

答案 0 :(得分:2)

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

但是请注意,无法保证在收集后多久调用它。

答案 1 :(得分:2)

您可以实施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方法   任何给定物体的机器。