Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/365.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 - Fatal编程技术网

Java 两个对象引用相互指向

Java 两个对象引用相互指向,java,Java,在目标C中,两个不同的参照物可能相互指向对方 但是这在Java中可能吗?我的意思是,两个对象引用可以互相指向吗?如果可能的话,他们什么时候会被垃圾收集 在嵌套类的情况下,两个对象(内部类和外部类)相互链接—这些对象是如何被垃圾收集的?我假设您谈论的是循环引用。如果无法通过从GC根开始的链访问对象,Java的GC将其视为“垃圾”。即使对象可能相互指向以形成一个循环,但如果从根上断开,它们仍然符合GC的条件 Java中有四种GC根: 局部变量通过线程堆栈保持活动状态。这不是真实对象虚拟参考,因此不可

在目标C中,两个不同的参照物可能相互指向对方

但是这在Java中可能吗?我的意思是,两个对象引用可以互相指向吗?如果可能的话,他们什么时候会被垃圾收集

在嵌套类的情况下,两个对象(内部类和外部类)相互链接—这些对象是如何被垃圾收集的?

我假设您谈论的是循环引用。如果无法通过从GC根开始的链访问对象,Java的GC将其视为“垃圾”。即使对象可能相互指向以形成一个循环,但如果从根上断开,它们仍然符合GC的条件

Java中有四种GC根:

  • 局部变量通过线程堆栈保持活动状态。这不是真实对象虚拟参考,因此不可见。出于所有目的,局部变量都是GC根

  • 活动Java线程始终被视为活动对象,因此是GC根。这对于线程局部变量尤其重要

  • 静态变量由其类引用。这一事实使它们成为事实上的GC根。类本身可以被垃圾收集,这将删除所有引用的静态变量。当我们通常使用应用服务器、OSGi容器或类装入器时,这一点特别重要

  • JNI引用是本机代码作为JNI调用的一部分创建的Java对象。这样创建的对象被特别处理,因为JVM不知道它是否被本机代码引用。这样的对象表示一种非常特殊的GC根形式

  • 你也可以阅读更多信息


    当然,您可以让对象相互引用。您只需将这两个对象中的
    指针传递给对方即可,这是完全有效的


    但是,这并不意味着仍然可以从GC根目录访问对象。把它想象成一棵树。如果从主干上切断一个完整的分支,则整个分支都将丢失,无论涉及多少对象,或者有多少对象正在维护彼此的引用。

    是的,您可以这样做。像这样:

    class Pointy {
        public Pointy other;
    }
    
    Pointy one = new Pointy();
    Pointy two = new Pointy();
    one.other = two;
    two.other = one;
    
    当两个对象都没有被其他对象指向,或者其他对象从当前运行的代码中“无法访问”时,它们被垃圾收集。Java垃圾收集器是,这意味着它们可以发现此类问题


    相反,系统(比如没有“现代”垃圾收集的Objective C——我不知道默认设置是什么)通常无法检测此类问题,因此对象可能会泄漏。

    对象引用只能指向对象。两个互相指向的对象引用是什么意思?哦!我是java新手!对于嵌套类,两个对象(内部类和外部类)相互链接。如果我说得通的话,这两个人怎么能把垃圾收集起来呢