2

我有一个从 Map 到 SoftReferences 的缓存。当它们被添加时,它们会被放入另一个队列中,以便通过 gzip 或类似的方式延迟压缩。我的想法是:我希望对压缩队列中的对象进行弱引用,这样当压缩任务到达对象时,如果它已经消失,我们就不必费心压缩它——而且压缩队列也没有t 保持对象处于活动状态,否则会被 GC 处理。

那么如果恰好有一个 SoftReference 和一个 WeakReference,那么 SoftReference 的语义是否仍然适用?

4

3 回答 3

3

是的,SoftReferences 的语义仍然适用:SoftReferences 比 WeakReferences 强。

WeakReferences 基本上被视为不存在的 GC。因此,只有弱可达性的对象可能会立即被 GC。但是,只有在需要满足内存需求的情况下,才考虑使用作为最强类型的 SoftReferences 才能访问的对象进行 GC。

因此,如果同时存在软引用和弱引用,则应用 SoftReference 的语义。

弱引用对象,不会阻止它们的引用对象被最终化、最终化,然后被回收。

http://download.oracle.com/javase/6/docs/api/java/lang/ref/WeakReference.html

软引用对象,由垃圾收集器根据内存需求自行清除。软引用最常用于实现内存敏感缓存。

http://download.oracle.com/javase/6/docs/api/java/lang/ref/SoftReference.html

于 2010-10-03T23:01:41.063 回答
2

是的,GC 对象没有任何问题,只要它有尽可能多的软/弱引用,直到它几乎有一个强引用。

于 2010-10-03T23:04:09.733 回答
0

你应该注意到,Weak Reference总是在收集之前Soft Reference。并且Soft Reference经常用来缓存一些东西。

这意味着:那个时候,它不再需要生存,但是,在将来的某个时候,也许你会再次需要它,而 Java 将无法再次实例化一个新对象。

于 2012-03-23T03:48:54.473 回答