2

我正在尝试通过这篇“Java 中的软引用”文章来研究软引用的含义:

https://www.baeldung.com/java-soft-references

我理解这篇文章的问题是它通过术语“软可达对象”来定义术语“软引用”,但我不知道“软可达对象”是什么意思。

也就是说,堆中的一个对象要么有它的引用,要么没有,对吧?

引用要么指向有效对象,要么为空,对吗?

一个对象什么时候变得“轻而易举”?

还是我弄错了?

4

2 回答 2

5

强引用、软引用和弱引用。

Student strongReference = new Student(); 

WeakReference<Student> weakReference = new WeakReference<>(strongReference);

相似地

Student strongRef = new Student();
SoftReference<Student> softReference = new SoftReference<>(strongRef);

在垃圾回收过程中,如果堆中的对象对其有强引用,则它会存活,如果它没有强引用但有 WeakReference,则它将无法存活。当对象在生命周期管理器上下文中传递出去时,它用于避免泄漏。

SoftReference 类似于弱引用,但它们可以在垃圾回收周期中存活,直到内存充足为止。

如果没有强引用并且有软引用,则对象是软可访问的。由于只有弱引用的对象有资格进行垃圾收集,另一方面,只有软引用的对象更容易在垃圾收集中存活(与弱引用相比),因此

  1. 一个没有强引用而只有软引用或弱引用的对象是软可达的

  2. 只有 WeakReference 而没有 Strong 或 soft 引用的对象是 Weekly Reachable

  3. 一个对象至少有一个强引用,有或没有任何软引用或弱引用,都是强可达的。

以下两种情况堆中的对象都是可轻松访问的。

Student stRef = new Student();
SoftReference <Student> sfRef = new SoftReference<>(stRef);
stRef = null;

或者

SoftReference <Student> sfRef = new SoftReference<>(new Student());

要使用对象get()方法,但要知道它为您提供了强大的参考。

假设你有

Student strongReference = new Student(); 

SoftReference<Student> softReference = new SoftReference<>(strongReference);
 strongReference = null; // object in heap is softly reachable now
 Student anotherStrongReference = softReference.get();
 if(anotherStrongReference != null){
      // you have a strong reference again
 }

因此,请避免将从get()Weak 或 Soft 引用的方法返回的非 null 对象分配给静态或实例变量,否则它只会破坏其中任何一个的使用。如果需要以弱或软引用的形式使用这些中的任何一个,那么最好的方法是存储静态或实例变量。当您需要使用get()非空检查并仅用作本地变量时。如果可能,只传递给其他方法,仅弱引用或软引用。

WeakReference 和 SoftReference 之间的区别在各种链接中得到了很好的解释,其中一个链接是: https ://stackoverflow.com/a/299702/504133

类型 WeakReference 和 SoftReference 对象的 PS 引用是强引用,它是弱或软可访问的包装对象,以防没有强引用可用(可以通过 using 检索对象get())。 WeakReference <Student> weakRefOfStudent = new WeakReference<>(new Student());

weakRefOfStudent是类型的强引用,WeakReference.java并且在堆中的对象类型 Student 是每周可访问的。该对象可以通过 访问weakRefOfStudent.get()。如果它是否已被垃圾收集,它可能为空,也可能不为空。

这只是为了澄清可能出现的疑虑。

于 2018-08-17T08:26:35.327 回答
2

我认为链接的文章在第一句话中很好地解释了这一点。软引用软可到达对象在此处作为同义词使用。

因此,您的问题的正确答案是,“软可到达对象是仅由软引用引用的对象”。

关于软引用的性质,这篇文章比我在此处的某些段落中更好地解释了这一点。

于 2018-08-17T08:27:28.680 回答