什么是柔软可触及的物体?

时间:2018-08-17 08:21:06

标签: java garbage-collection soft-references

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

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

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

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

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

什么时候对象可以变得“ 可访问”?

还是我弄错了?

2 个答案:

答案 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,则对象是可软到达的。因为只有弱引用的对象才有资格进行垃圾回收,另一方面,只有软引用的对象更容易受到垃圾回收的影响(与弱引用相比)

  1. 没有强引用且仅具有软引用或弱引用的对象可以轻易到达

  2. 只有WeakReference而没有强引用或软引用的对象是每周可访问的

  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()方法返回的非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)

我认为链接的文章在第一句话中对此做了很好的解释。此处是软引用软可访问对象的代名词。

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

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