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

有什么不同?


从理解弱引用,Ethan Nicholas:

弱引用

简而言之,一个弱的参考是一个不够强大的对象,不足以强迫对象留在记忆中。 弱引用使您可以利用垃圾收集器为您确定可达性的能力,因此您无需自己动手。 你创建一个像这样的弱引用:

WeakReference weakWidget = new WeakReference(widget);

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

...

软参考

软引用就像一个弱引用,只是它不太渴望丢掉它引用的对象。 只有弱可达性的对象(对它的最强引用是WeakReferences )将在下一次垃圾回收循环中被丢弃,但是可以轻松访问的对象通常会持续一段时间。

SoftReferences并不要求与WeakReferences任何不同,但在实践中,只要内存充足,软性可访问对象通常会被保留。 这使得它们成为高速缓存的良好基础,例如上面描述的图像高速缓存,因为您可以让垃圾回收器担心对象的可访问性(永远不会从缓存中删除强可及的对象)以及它有多糟糕需要他们消耗的内存。

Peter Kessler在评论中补充道:

Sun JRE不同于WeakReferences对待SoftReference。 如果可用内存没有压力,我们试图保留由SoftReference引用的对象。 一个细节:“客户端”和“服务器”JRE的策略是不同的:客户端JRE试图通过清除SoftReferences而不是扩展堆来保持足迹小,而服务器JRE试图保持您的性能高,喜欢扩大堆(如果可能),而不是清除SoftReferences。 一种尺寸不适合所有。


热衷收集弱引用。 如果GC发现某个对象的可达性很弱(只能通过弱引用访问),它会立即清除对该对象的弱引用。 因此,它们可以很好地保持对程序也保存(强引用)“关联信息”的某个对象的引用,例如关于类的缓存反射信息或对象的包装等。任何使在与其关联的对象之后没有意义保留GC-ed。 当弱引用被清除时,它会被放入一个引用队列中,代码在某处进行轮询,同时也会放弃关联的对象。 也就是说,您保留有关某个对象的额外信息,但是一旦所引用的对象消失,就不需要这些信息。 实际上,在某些情况下,您甚至可以继承WeakReference子类并在WeakReference子类的字段中保留关于该对象的关联额外信息。 WeakReference的另一个典型用途是与Maps一起保留规范实例。

另一方面,SoftReferences适用于缓存外部可回收资源,因为GC通常会延迟清除它们。 尽管在引发OutOfMemoryError之前所有的SoftReference都会被清除,但它们在理论上不会导致OOME [*]。

典型的用例示例是保留文件内容的解析形式。 您将实现一个系统,您可以在其中加载文件,解析它并将SoftReference保留为解析表示的根对象。 下一次您需要该文件时,您将尝试通过SoftReference检索它。 如果您可以检索它,则可以省去另一个加载/解析,并且如果GC在此期间清除它,则重新加载它。 这样,您可以利用可用内存进行性能优化,但不要冒OOME的风险。

现在为[*]。 保持SoftReference本身不会导致OOME。 另一方面,如果您错误地将SoftReference用于任务,WeakReference将用于(即,您保留与某个对象关联的信息以某种方式强引用,并且在Reference对象被清除时丢弃它),则可以运行到OOME中您的代码轮询ReferenceQueue并丢弃关联的对象可能不会及时运行。

所以,这个决定取决于使用情况 - 如果你缓存的信息构建起来很昂贵,但是可以从其他数据中重构,那么使用软引用 - 如果你保留对某些数据的规范实例的引用,或者你想要有一个没有“拥有”它的对象的引用(从而防止它被GC'd),使用弱引用。


在Java中 ; 从最强到最弱的顺序有:强,软,弱和幻影

一个强有力的参考是一个正常的参考,可以保护引用的对象免受GC的收集。 即永不垃圾收集。

软引用符合垃圾回收器收集的条件,但可能直到需要内存时才会收集。 即垃圾收集之前OutOfMemoryError

弱引用是一种引用,它不保护GC收集引用的对象。 即没有Strong或Soft refs时垃圾收集。

Phantom引用是一个对象的引用,它在被完成后,但在其分配的内存已被回收之前被幻影引用。

资源

比喻:假设一个JVM是一个王国,物体是王国之王,而GC是试图杀死国王(物体)的王国的攻击者。

  • 当国王强大时 ,GC不能杀死他。
  • 当国王是软的时候 ,GC攻击他,但是国王统治着王国,直到有资源可用。
  • 当国王弱时 ,GC攻击他,但在没有保护的情况下统治这个王国。
  • 当国王是幻影时 ,GC已经杀死了他,但国王可以通过他的灵魂获得。
  • 链接地址: http://www.djcxy.com/p/73749.html

    上一篇: What's the difference between SoftReference and WeakReference in Java?

    下一篇: If object is SomeType vs. object as SomeType