当前位置: 首页 > 面试题库 >

Java中的SoftReference和WeakReference有什么区别?

秦博达
2023-03-14
问题内容

java.lang.ref.WeakReference和之间有什么区别java.lang.ref.SoftReference?


问题答案:

从Ethan Nicholas的《理解弱引用》中:

参考不足

一个弱引用,简单地说,是不是强大到足以迫使对象保留在内存中的参考。弱引用使您可以利用垃圾收集器的能力来确定您的可达性,因此您不必自己做。您创建像这样的弱引用:

WeakReference weakWidget = new WeakReference(widget);

然后可以在代码中的其他地方使用 weakWidget.get()以获得实际的 Widget对象。当然,弱引用不足以阻止垃圾回收,因此您可能会发现(如果没有对小部件的强引用) weakWidget.get()突然开始返回null。

软参考

甲软参考酷似弱引用,不同之处在于它是更少急于扔掉其所引用的对象。只有弱可达性的对象(对其最强的引用是WeakReferences)将在下一个垃圾回收周期中被丢弃,但是柔弱可达性的对象通常会停留一段时间。

SoftReferences并不需要向任何行为不同于 WeakReferences,但在实践中轻轻地可达对象一般保留,只要内存供应充足。这使它们成为缓存(例如上述图像缓存)的良好基础,因为您可以让垃圾收集器担心对象的可访问性(一个高度可访问的对象将永远不会从缓存中删除)。需要他们正在消耗的内存。

彼得·凯斯勒(Peter Kessler)在评论中添加:

Sun JRE确实将SoftReferenceWeakReferences区别对待。如果可用内存没有压力,我们尝试保留由SoftReference引用的对象。一个细节:“-client”和“ -server” JRE的策略不同:-client JRE倾向于通过清除SoftReferences而不是扩展堆来减小占用的空间,而-server JRE尝试保持您的占用空间。通过扩大堆(如果可能)而不是清除SoftReferences,可以提高性能。一种尺寸并不适合所有尺寸。



 类似资料:
  • 问题内容: 我一直认为Java 中的运算符用于验证其两个布尔操作数是否均为,并且该&运算符用于对两种整数类型进行按位运算。 最近我知道,也可以使用运算符来验证其两个布尔操作数是否均为,唯一的区别是即使LHS操作数为false,它也会检查RHS操作数。 Java中的运算符是否在内部重载?还是在这背后有其他概念? 问题答案: <-验证两个操作数 <-停止评估第一个操作数是否为false,因为结果为fa

  • 问题内容: 我只是想知道为什么我们通常在两个布尔之间使用逻辑OR 而不是按位OR ,尽管它们都运行良好。 我的意思是,请看以下内容: 我们可以代替使用吗?与和相同。 问题答案: 如果您使用和形式,而不是这些运算符的和形式,则Java不会费心地单独评估右手操作数。 这是您是否希望缩短评估时间的问题-在 大多数情况 下都是如此。 说明短路好处的一个好方法是考虑以下示例。 正如Jeremy和Peter提

  • 问题内容: 我在看一些模拟的OCJP问题。我遇到了一个非常令人困惑的语法。这里是: 为什么输出在和之间变化? 问题答案: 问题只是和您玩弄混乱的空格。 是通常的(不等于)比较。 另一方面: 最好写成如下形式: 因此,这是两个运算符。 首先反转。 然后将其分配回。 赋值运算符返回分配的值。因此,计算结果为true-这就是您要打印的内容。

  • 问题内容: 我想了解Java中和类型之间的区别,特别是它们与GWT有关。我知道不支持该方法,但是如果需要的话,我需要更多信息。 问题答案: 我不确定GWT因素是否有所不同,但总的来说: 布尔值 是Java基本类型,而 布尔值 是包装布尔值的对象/引用类型 像这样在图元和对象之间进行转换称为装箱/拆箱。 这是更多信息: http://javaeye.wordpress.com/2008/06/17/

  • 问题内容: 和之间有什么区别? 问题答案: 是一个对象,并且是原始数据类型。 有关更多详细信息,请参见此答案。 Double类将原始类型double的值包装在对象中。类型为Double的对象包含单个类型为double的字段。 来源:http : //docs.oracle.com/javase/7/docs/api/java/lang/Double.html

  • 问题内容: 自从90年代末在大学期间使用JBuilder以来,我从未接触过Java,所以我有点脱节-无论如何我本周一直在从事一个小型Java项目,并使用Intellij IDEA作为我的IDE ,以便与我的常规.Net开发有所不同。 我注意到它支持添加接口和@interface,什么是@interface,它与普通接口有何不同? 与 我已经做了一些搜索,但找不到大量有用的有关@interface的