如果存在两级软引用对象,GC将执行什么操作

per*_*ser 3 java garbage-collection soft-references

我知道在Java中我们有软引用的概念.如果:

1)软引用"sf"指对象A.

2)在对象A中,它具有强引用,指对象B.

3)对象A和B不在任何其他地方引用.

根据定义,对象A和对象B都"可以轻柔地到达",对吗?

然后说我们现在用完了内存,GC开始了.是否有可能GC会回收对象B而不是对象A?

如果是这种情况,稍后如果我们想通过"sf"访问对象B,它将为null.java如何避免这种情况发生?

我在java doc中没有看到任何解释.

Ste*_*n C 6

然后说我们现在用完了内存,GC开始了.是否有可能GC会回收对象B而不是对象A?

不会.GC不会破坏可到达对象中的强引用.(当然,作为回收过程的一部分,它会破坏无法到达的对象中的引用.但是你无法观察到这种情况......因为要观察它,你需要仍然可以访问该对象.)

这是java.lang.ref包中javadoc中此语句的结果.

"最后,当一个对象无法访问时,因此无法以上述任何方式访问,因此有资格进行回收."

......"上述方式"包括强大,柔软,虚弱和虚幻的可达性.

这两个突出显示的词语意味着回收资格是处于无法到达状态的结果.由于其他州都没有提到填海资格,我们得出结论,不可达性是填海工程的先决条件.

这肯定与常识一致.如果(假设)允许GC在可达对象中"清空"强引用,则应用程序在进入此状态后无法安全地处理对象.(考虑一下这个被引用的引用是在库类的实例中的情况......)