我正在尝试通过这篇“Java 中的软引用”文章来研究软引用的含义:
https://www.baeldung.com/java-soft-references
我理解这篇文章的问题是它通过术语“软可达对象”来定义术语“软引用”,但我不知道“软可达对象”是什么意思。
也就是说,堆中的一个对象要么有它的引用,要么没有,对吧?
引用要么指向有效对象,要么为空,对吗?
一个对象什么时候变得“轻而易举”?
还是我弄错了?
我正在尝试通过这篇“Java 中的软引用”文章来研究软引用的含义:
https://www.baeldung.com/java-soft-references
我理解这篇文章的问题是它通过术语“软可达对象”来定义术语“软引用”,但我不知道“软可达对象”是什么意思。
也就是说,堆中的一个对象要么有它的引用,要么没有,对吧?
引用要么指向有效对象,要么为空,对吗?
一个对象什么时候变得“轻而易举”?
还是我弄错了?
强引用、软引用和弱引用。
Student strongReference = new Student();
WeakReference<Student> weakReference = new WeakReference<>(strongReference);
相似地
Student strongRef = new Student();
SoftReference<Student> softReference = new SoftReference<>(strongRef);
在垃圾回收过程中,如果堆中的对象对其有强引用,则它会存活,如果它没有强引用但有 WeakReference,则它将无法存活。当对象在生命周期管理器上下文中传递出去时,它用于避免泄漏。
SoftReference 类似于弱引用,但它们可以在垃圾回收周期中存活,直到内存充足为止。
如果没有强引用并且有软引用,则对象是软可访问的。由于只有弱引用的对象有资格进行垃圾收集,另一方面,只有软引用的对象更容易在垃圾收集中存活(与弱引用相比),因此
一个没有强引用而只有软引用或弱引用的对象是软可达的
只有 WeakReference 而没有 Strong 或 soft 引用的对象是 Weekly Reachable
一个对象至少有一个强引用,有或没有任何软引用或弱引用,都是强可达的。
以下两种情况堆中的对象都是可轻松访问的。
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()
。如果它是否已被垃圾收集,它可能为空,也可能不为空。
这只是为了澄清可能出现的疑虑。
我认为链接的文章在第一句话中很好地解释了这一点。软引用和软可到达对象在此处作为同义词使用。
因此,您的问题的正确答案是,“软可到达对象是仅由软引用引用的对象”。
关于软引用的性质,这篇文章比我在此处的某些段落中更好地解释了这一点。