【问题标题】:Is it possible to identify that object is collected by garbage collector or not in java?是否可以识别该对象是由垃圾收集器收集的还是在 java 中不收集的?
【发布时间】:2013-12-29 23:12:54
【问题描述】:

我已阅读该对象在以下情况下符合垃圾收集条件。

  1. 该对象的所有引用都明确设置为 null。
  2. 在块内创建对象并且引用超出范围 一旦控制退出该块。
  3. 如果一个对象持有另一个对象的引用,则父对象设置为 null 对象以及当您将容器对象的引用设置为 null、child 或 包含的对象自动成为垃圾 收藏。

但是有没有办法确定符合垃圾收集条件的对象是由垃圾收集器收集的?

【问题讨论】:

  • 您为什么需要知道这些?有什么具体原因吗?
  • 只要您引用对象(直接或间接),它就没有资格进行垃圾回收。所以,当它最终被垃圾回收时,你不再有对它的引用,这意味着你无法识别它——你必须完全忘记它,否则它不会被垃圾回收。跨度>
  • @Nambari.. 我正在阅读有关垃圾收集器工作的文章,这个问题出现在我的脑海中。没有其他原因。
  • 就像其他人所说的:你唯一的选择是finalize 方法。但是,我必须告诉你:我编写了成千上万行 Java 代码,但我从未发现自己处于需要使用 finalize 的情况。与其他程序员交谈时,它永远不会出现。除了满足您对此的任何好奇心外,我强烈建议您反对使用此方法。我真的不知道他们为什么不弃用它......
  • @RaduMurzea:有一些good uses of the finalize method,尽管它们非常罕见。

标签: java garbage-collection


【解决方案1】:

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

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

【讨论】:

  • 你第一句话错了。 finalize() 将在对象被视为可收集时调用,而不是在它被收集后调用。
【解决方案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 virtual 永远不会多次调用 finalize 方法 任何给定对象的机器。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-20
    • 1970-01-01
    • 1970-01-01
    • 2010-11-17
    • 2012-12-29
    • 1970-01-01
    • 2020-02-08
    相关资源
    最近更新 更多