两个对象引用指向彼此

Sai*_*nya 10 java

在目标C中,两个不同的引用可能相互指向.

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

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

NIN*_*OOP 29

我假设你在谈论循环引用.Java的GC认为对象是"垃圾",如果它们无法通过从GC根开始的链到达.即使对象可能彼此指向形成一个循环,如果从根切断它们仍然符合GC的条件.

Java中有四种GC根:

  1. 局部变量由一个线程堆栈保持活动状态.这不是真实对象虚拟参考,因此不可见.对于所有意图和目的,局部变量是GC根.

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

  3. 静态变量由其类引用.这一事实使他们成为事实上的GC根源.类本身可以被垃圾收集,这将删除所有引用的静态变量.当我们一般使用应用程序服务器,OSGi容器或类加载器时,这一点特别重要.

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

您还可以在此处阅读以获取更多信息.

在此输入图像描述


Cal*_*lum 7

是的,你可以这样做.像这样:

class Pointy {
    public Pointy other;
}

Pointy one = new Pointy();
Pointy two = new Pointy();
one.other = two;
two.other = one;
Run Code Online (Sandbox Code Playgroud)

当两个对象没有被彼此指向的任何对象或其他与当前运行代码"无法访问"的对象时,它们被垃圾收集.Java垃圾收集器正在"跟踪"垃圾收集器,这意味着他们可以发现这类问题.

相反,引用计数系统(如Objective C没有"现代"垃圾收集 - 我不知道默认是什么)通常无法检测到这类问题,因此对象可能会泄露.