在目标C中,两个不同的引用可能相互指向.
但这在Java中是否可行?我的意思是,两个对象引用可以互相指向吗?如果有可能,他们什么时候会被垃圾收集?
而且,在嵌套类的情况下,两个对象(内部类和外部类)相互链接 - 这些对象如何被垃圾收集?
NIN*_*OOP 29
我假设你在谈论循环引用.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;
Run Code Online (Sandbox Code Playgroud)
当两个对象没有被彼此指向的任何对象或其他与当前运行代码"无法访问"的对象时,它们被垃圾收集.Java垃圾收集器正在"跟踪"垃圾收集器,这意味着他们可以发现这类问题.
相反,引用计数系统(如Objective C没有"现代"垃圾收集 - 我不知道默认是什么)通常无法检测到这类问题,因此对象可能会泄露.
| 归档时间: |
|
| 查看次数: |
8095 次 |
| 最近记录: |