我有一个从Map到SoftReferences构建的缓存。当它们被添加时,它们被放入另一个队列中,通过gzip或其他类似的方式被压缩下来。 我的想法是这样的:我希望WeakReferences到压缩队列中的对象,这样当压缩器任务到达对象时,如果它已经消失,我们就不必费心压缩它 - 而且压缩器的队列也没有保持对象的活着,否则将是GC。
因此,如果只有一个SoftReference和一个WeakReference,SoftReference的语义是否仍适用?
答案 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将不再用于实例化新对象。