在Java中,是否有可能确定对象是否被垃圾回收器收集了呢?

49 浏览
0 Comments

在Java中,是否有可能确定对象是否被垃圾回收器收集了呢?

我读过这样的内容,对象以下情况会变得适合进行垃圾回收:

  1. 对象的所有引用都被显式设置为null。
  2. 对象在一个块内被创建,当控制退出该块时,引用便超出作用域。
  3. 父对象被设置为null,如果一个对象持有另一个对象的引用,并且当你设置容器对象的引用为null时,子对象或包含的对象自动变得适合进行垃圾回收。

但是有没有办法确定适合进行垃圾回收的对象是由垃圾收集器收集的呢?

admin 更改状态以发布 2023年5月22日
0
0 Comments

当对象被垃圾回收后,JVM会调用其finalize方法。默认实现什么也不做;您可以覆盖它,例如,打印道别消息或关闭某些已打开的资源。

然而,请注意,不保证在被收集后多久调用。

0
0 Comments

你可以实现 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 方法可以采取任何操作,包括将此对象再次提供给其他线程;

但也有这样的说明:

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

0