我试图通过这篇“ 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就像弱引用一样,但是它们可以在垃圾回收周期中生存,直到有足够的内存可用为止。
如果没有强引用,并且具有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
附言类型WeakReference和SoftReference对象的引用是强引用,在没有强引用的情况下,弱或软可访问的是包装对象(可以使用
get()
检索该对象)。WeakReference <Student> weakRefOfStudent = new WeakReference<>(new Student());
weakRefOfStudent
是类型WeakReference.java
的强引用,并且每周可以访问Student类型的Heap中的对象。可以通过weakRefOfStudent.get()
访问该对象。如果已被垃圾回收,则为null或不为null。这只是为了澄清可能发生的疑问。
关于java - 什么是柔软可触及的物体?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51891168/