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

Dhr*_*tel 6 java garbage-collection

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

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

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

Sot*_*lis 4

你可以实现该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!");
    }
}
Run Code Online (Sandbox Code Playgroud)

打印

Finalizer: See ya, nerds!
Run Code Online (Sandbox Code Playgroud)

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

Finalize 的一般约定是,如果 JavaTM 虚拟机确定任何尚未死亡的线程不再可以通过任何方式访问该对象,则调用它,除非采取了操作通过对其他已准备好最终确定的对象或类进行最终确定。Finalize 方法可以执行任何操作,包括使该对象再次可供其他线程使用;

但是也

对于任何给定的对象,Java 虚拟机绝不会多次调用 Finalize 方法。