两个对象引用相互指向
2022-09-04 23:56:41
在目标C中,两个不同的引用有可能相互指向。
但这在Java中可能吗?我的意思是,两个对象引用可以相互指向吗?如果可能的话,它们什么时候会被垃圾收集?
而且,在嵌套类的情况下,两个对象(内部类和外部类)相互链接 - 如何对这些对象进行垃圾收集?
在目标C中,两个不同的引用有可能相互指向。
但这在Java中可能吗?我的意思是,两个对象引用可以相互指向吗?如果可能的话,它们什么时候会被垃圾收集?
而且,在嵌套类的情况下,两个对象(内部类和外部类)相互链接 - 如何对这些对象进行垃圾收集?
我假设您正在谈论循环引用 。Java的GC认为对象是“垃圾”,如果它们无法通过从GC根开始的链访问。即使对象可能相互指向以形成循环,如果从根部切断,它们仍然有资格获得GC。
Java 中有四种 GC 根:
局部变量由线程堆栈保持活动状态。这不是一个真实的对象虚拟参考,因此不可见。对于所有意图和目的,局部变量都是 GC 根。
活动 Java 线程始终被视为活动对象,因此是 GC 根。这对于线程局部变量尤其重要。
静态变量由其类引用。这一事实使它们成为事实上的GC根。类本身可以被垃圾回收,这将删除所有引用的静态变量。当我们使用应用程序服务器、OSGi 容器或类装入器时,这一点特别重要。
JNI 引用是本机代码作为 JNI 调用的一部分创建的 Java 对象。这样创建的对象会受到特殊处理,因为 JVM 不知道它是否被本机代码引用。此类对象表示一种非常特殊的 GC 根形式。
您也可以在此处阅读以获取更多信息。
是的,您可以执行此操作。喜欢这个:
class Pointy {
public Pointy other;
}
Pointy one = new Pointy();
Pointy two = new Pointy();
one.other = two;
two.other = one;
当两个对象都没有被彼此以外的任何东西指向,或者从当前运行的代码中“无法访问”的其他对象时,它们将被垃圾回收。Java垃圾回收器是“跟踪”垃圾回收器,这意味着他们可以发现这类问题。
相反,引用计数系统(如没有“现代”垃圾回收的Objective C - 我不知道默认值是什么)通常无法检测到此类问题,因此对象可能会被泄漏。