Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/360.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
是否可以在java中标识对象是否由垃圾收集器收集?_Java_Garbage Collection - Fatal编程技术网

是否可以在java中标识对象是否由垃圾收集器收集?

是否可以在java中标识对象是否由垃圾收集器收集?,java,garbage-collection,Java,Garbage Collection,我已经读到,在以下情况下,对象将有资格进行垃圾收集 该对象的所有引用都显式设置为null 对象在块内创建,引用超出范围 一旦控制退出该块 如果一个对象持有另一个对象的引用,则父对象设置为null 对象,并且当您将容器对象的引用设置为null时,子对象或 包含的对象将自动成为垃圾 收藏 但是,是否有任何方法可以识别垃圾收集器收集的符合垃圾收集条件的对象 对象被垃圾收集后,JVM调用其方法。默认实现什么都不做;您可以覆盖它,例如打印告别邮件,或关闭某些打开的资源 但是请注意,不能保证在收集后多久调用

我已经读到,在以下情况下,对象将有资格进行垃圾收集

  • 该对象的所有引用都显式设置为null
  • 对象在块内创建,引用超出范围 一旦控制退出该块
  • 如果一个对象持有另一个对象的引用,则父对象设置为null 对象,并且当您将容器对象的引用设置为null时,子对象或 包含的对象将自动成为垃圾 收藏
  • 但是,是否有任何方法可以识别垃圾收集器收集的符合垃圾收集条件的对象

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


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

    您可以实现
    对象#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方法 任何给定对象的机器


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