java - 两个对象引用指向对方

标签 java

在 objective-c 中,两个不同的引用有可能相互指向对方。

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

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

最佳答案

我假设您在谈论循环引用。如果无法通过从 GC 根开始的链访问对象,Java 的 GC 会将对象视为“垃圾”。即使对象可能相互指向形成一个循环,但如果从根切断它们仍然有资格进行 GC。

Java中有四种GC根:

  1. 局部变量由线程堆栈保持 Activity 状态。这不是真实对象的虚拟引用,因此是不可见的。出于所有意图和目的,局部变量是 GC 根。

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

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

  4. JNI 引用是 native 代码作为 JNI 调用的一部分创建的 Java 对象。这样创建的对象被特殊对待,因为 JVM 不知道它是否被 native 代码引用。这些对象代表了一种非常特殊的 GC root 形式。

您还可以阅读 here获取更多信息。

enter image description here

关于java - 两个对象引用指向对方,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17587045/

相关文章:

java - 如何使用gradle导入依赖

java - 为什么 A.class.getClassLoader() 不返回 loader.loadClass ("A"使用的加载器)

java - 在 Camel 中提取路由统计信息

java - Apache PDFBox:编码问题

java - 使用引用用 Java 模拟 C++ 指针?

java - 我正在尝试将拦截器与mvc注释驱动一起添加到spring中,以下应该可以工作,但是不行?

java - android 事件监听器中的相对布局问题 : one child's listener is getting applied to all children

java - 连接到邮件服务器时出现异常

java - SonarLint:使这个匿名内部类成为 lambda(非函数式接口(interface))

java - Hibernate 更新对象中的所有列