GC会收集SoftReference和WeakReference引用的对象吗?

时间:2010-10-03 22:52:43

标签: java weak-references soft-references

我有一个从Map到SoftReferences构建的缓存。当它们被添加时,它们被放入另一个队列中,通过gzip或其他类似的方式被压缩下来。 我的想法是这样的:我希望WeakReferences到压缩队列中的对象,这样当压缩器任务到达对象时,如果它已经消失,我们就不必费心压缩它 - 而且压缩器的队列也没有保持对象的活着,否则将是GC。

因此,如果只有一个SoftReference和一个WeakReference,SoftReference的语义是否仍适用?

3 个答案:

答案 0 :(得分:3)

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

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

因此,如果同时存在软引用和弱引用,则应用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

答案 1 :(得分:2)

是的,对于具有任意数量的软/弱引用的对象,GC没有问题,直到它有几乎一个强引用。

答案 2 :(得分:0)

您应该注意到Weak Reference总是在Soft Reference之前收集。 Soft Reference经常用来缓存某些东西。

这意味着:在那个时候,它不再需要生存,但是,有时在未来,也许你再次需要它,而Java将不再用于实例化新对象。