当前位置: 首页 > 知识库问答 >
问题:

是否可以识别该对象是由垃圾收集器或不在java中收集?

徐嘉勋
2023-03-14

我已经读到,在以下情况下,对象可以进行垃圾收集。

  1. 该对象的所有引用都显式设置为null

但是,是否有无论如何要标识的对象是合格的垃圾回收机制是由垃圾收集器收集?

共有2个答案

荣声
2023-03-14

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

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

方斌
2023-03-14

您可以实现对象#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虚拟机都不会多次调用finalize方法。

 类似资料:
  • 问题内容: 有没有一种方法可以检查垃圾收集器是否可以提取对象? 在我的代码中的某个地方,我有一个对象的引用: 然后,通过Eclipse Debugger,获得对象的存储位置。之后,我将引用设置为null: 有什么方法可以检查以前引用的对象现在是否适合垃圾回收,或者是否有其他引用? 非常感谢, 斯特凡 问题答案: 您无法在运行时使用任意对象执行此操作,实际上,不可能完全确定地执行此操作。但是,有两种

  • 有人能给我解释一下原因吗?

  • 问题内容: 该问题已发布在某个网站上。我在这里找不到正确的答案,因此我将其再次发布在这里。 我的查询与停止线程无关。让我改一下我的问题。A行(请参见上面的代码)启动一个新线程;和B行使线程引用为空。因此,JVM现在具有一个线程对象(处于运行状态),该对象不存在引用(如B行中的t = null)。所以我的问题是,为什么这个线程(在主线程中不再有引用)一直保持运行状态,直到主线程运行。根据我的理解,线

  • [GC(分配失败)[defnew:10931K->472K(12288K),0.0053905秒]10931K->10712K(39616K),0.0054285秒][times:user=0.00 sys=0.00,real=0.01秒] [GC(分配失败)[defnew:10712k->472k(12288k),0.0057686秒]20952k->20952k(39616k),0.00580

  • 问题内容: 在Java中,我做了很多类似的事情而没有考虑太多: 但是,最近我不确定这样做是否安全。毕竟,在对象创建之后就没有对它的引用了(嗯,有引用,但是这个值吗?),所以看起来存在垃圾回收器可能会在执行过程中删除该对象的危险的东西。因此,该方法应如下所示: 现在,我很确定第一个版本可以使用,并且我从未遇到任何问题,但是我想知道在所有情况下这样做是否安全(不仅在特定的JVM中,而且最好根据语言规范

  • 问题内容: 我知道当分配DirectbyteBuffer时,它不受垃圾回收的限制,但是我想知道的是 包装 对象是否被垃圾回收了。 例如,如果我分配了一个新的DirectByteBuffer dbb,然后使用dbb.duplicate()将其复制(浅复制),则我将在同一块内存中使用两个包装器。 这些包装器是否要进行垃圾收集?如果我做了 我最终会自己OOM吗? 问题答案: 在Sun JDK中,由创建的