我试图通过这篇“ 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/

10-10 04:15