我正在尝试通过这篇“ Java中的软引用”文章来研究软引用的含义:
https://www.baeldung.com/java-soft-references
我理解本文的问题是它通过术语“软可访问对象”定义了“软引用”,但是我不知道“软可访问对象”是什么意思。
也就是说,堆中的一个对象要么具有对它的引用,要么没有,对吗?
引用要么指向有效对象,要么为空,对吧?
什么时候对象可以变得“ 软可访问”?
还是我弄错了?
答案 0 :(得分:2)
强引用,软引用和弱引用。
Student strongReference = new Student();
WeakReference<Student> weakReference = new WeakReference<>(strongReference);
类似地
Student strongRef = new Student();
SoftReference<Student> softReference = new SoftReference<>(strongRef);
在垃圾回收过程中,如果堆中的对象对其有很强的引用,则该对象将继续存在;如果它没有强引用但具有WeakReference,则该对象将无法保留。当对象从生命周期管理器上下文中传递出去时,它用于避免泄漏。
SoftReference就像弱引用,但是它们可以在垃圾回收周期中幸存下来,直到有足够的内存可用为止。
如果没有强引用并且具有SoftReferences,则对象是可软到达的。因为只有弱引用的对象才有资格进行垃圾回收,另一方面,只有软引用的对象更容易受到垃圾回收的影响(与弱引用相比)
没有强引用且仅具有软引用或弱引用的对象可以轻易到达
只有WeakReference而没有强引用或软引用的对象是每周可访问的
具有至少一个强引用(带有或不带有任何软或弱引用)的对象是强可到达的。
以下两种情况都可以轻松访问堆中的对象。
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()
方法返回的非null对象辅助静态或实例变量,否则它会挫败这两种方法的使用。如果需要,以弱引用或软引用的形式使用这些最佳方式存储静态或实例变量。每当需要使用get()
时,请检查其是否不为null并仅用作本地变量。如果可能,仅传递给弱引用或软引用。
WeakReference和SoftReference之间的区别在各种链接中都有很好的解释,其中一个链接是: https://stackoverflow.com/a/299702/504133
P.S。类型为WeakReference和SoftReference对象的引用是强引用,在没有强引用的情况下,它是弱或软可访问的包装对象(可以使用get()
来检索该对象)。强>
WeakReference <Student> weakRefOfStudent = new WeakReference<>(new Student());
weakRefOfStudent
是类型WeakReference.java
的强引用,并且每周可以访问Student类型的堆中的对象。 weakRefOfStudent.get()
可以访问该对象。如果已被垃圾回收,则为null或不为null。
这只是为了澄清可能发生的疑问。
答案 1 :(得分:1)
我认为链接的文章在第一句话中对此做了很好的解释。此处是软引用和软可访问对象的代名词。
因此,对您的问题的正确答案是:“软可访问对象是仅由软引用引用的对象”。
关于软引用的性质,这篇文章比我在这里的某些段落中能更好地解释了这一点。