【问题标题】:What is a softly reachable object?什么是柔软可触及的物体?
【发布时间】:2019-01-24 05:56:05
【问题描述】:

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

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

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

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

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

一个对象什么时候变得“可达”?

还是我弄错了?

【问题讨论】:

  • “软可到达对象没有指向它的强引用”.
  • @luk2302 是的,我注意到文章中的那句话,但它是什么意思?我想我明白强引用是什么意思(普通引用),但是以前被强引用指向的对象可以变成“软可达”吗?
  • @dbl 您提供的链接中的可达性部分解释了它。谢谢你。如果您将此作为答案发布,我会接受。
  • 没必要,祝你学习顺利。这是一个很好的话题,也许有些人会添加一个你应该接受的更广泛的答案......

标签: java garbage-collection soft-references


【解决方案1】:

强引用、软引用和弱引用。

Student strongReference = new Student(); 

WeakReference<Student> weakReference = new WeakReference<>(strongReference);

同样

Student strongRef = new Student();
SoftReference<Student> softReference = new SoftReference<>(strongRef);

在垃圾回收过程中,如果堆中的对象有强引用,那么它就会存活,如果它没有强引用但有弱引用,那么它就不会存活。当对象在生命周期管理器上下文中传递出去时,它用于避免泄漏。

SoftReference 类似于弱引用,但它们会在垃圾回收周期中存活下来,直到内存充足为止。

如果没有强引用并且有软引用,则对象是软可达。由于只有弱引用的对象有资格进行垃圾收集,另一方面,只有软引用的对象更容易在垃圾收集中幸存下来(与弱引用相比),因此

  1. 没有强引用且只有软引用或弱引用的对象是软可达的

  2. 只有 WeakReference 而没有 Strong 或 soft 引用的对象是 Weekly Reachable

  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
 }

因此,请避免将 Weak 或 Soft 引用的 get() 方法返回的非 null 对象分配给静态或实例变量,否则它只会破坏其中任何一个的使用。如果需要,最好以弱引用或软引用的形式使用这些方法中的任何一个来存储静态或实例变量。当您需要使用 get() 时,请检查 not null 并仅用作本地变量。如果可能,只传递给其他方法,仅弱引用或软引用。

WeakReference 和 SoftReference 之间的区别在各种链接中得到了很好的解释,其中一个链接是: https://stackoverflow.com/a/299702/504133

附: WeakReference 和 SoftReference 类型对象的引用是强引用的,它是弱或软可访问的包装对象,以防没有强引用可用(可以使用get() 检索对象)。 WeakReference &lt;Student&gt; weakRefOfStudent = new WeakReference&lt;&gt;(new Student());

weakRefOfStudentWeakReference.java 类型的强引用,并且学生类型的堆中的对象每周可访问weakRefOfStudent.get() 可以访问该对象。如果它是否已被垃圾收集,它可能为空,也可能不为空。

这只是为了澄清可能出现的疑问。

【讨论】:

  • 这根本没有回答 OPs 的问题,也没有解释任何关于这些引用的性质以及如何(正确)使用它们 - 而不仅仅是创建它们。
  • @nits.kk 感谢您提供强引用、弱引用和软引用的清晰示例。对象是否变得通过new SoftReference&lt;&gt;(...)“可轻松访问”?
  • @Very Objective 我已经编辑了我的答案。希望对你有帮助
  • 已接受答案。我只会添加以下两个链接以进一步澄清我的误解:1.How is WeakReference different 2.Reachability
  • 是的,有许多对您有帮助的链接。当我开始使用 Android 时,我第一次遇到这些术语。我开始并找到了这些术语,有很多与内存相关的问题。如果对您有帮助,您可以将我的回答标记为已接受
【解决方案2】:

我认为链接的文章在第一句话中很好地解释了这一点。 软引用软可到达对象在此处同义使用。

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

关于软引用的性质,这篇文章比我在此处的某些段落中解释得更好。

【讨论】:

  • 您必须区分 软引用SoftReference 的一个实例)和它的 referent(可通过封装参考)。后者是 softly reachable 对象。然而,并不是每个软可达对象都是SoftReference的指代对象。它们可能可以从另一个软可访问对象间接访问。
猜你喜欢
  • 2019-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-18
  • 1970-01-01
  • 1970-01-01
  • 2011-05-16
  • 2011-10-22
相关资源
最近更新 更多