我有一个从 Map 到 SoftReferences 的缓存。当它们被添加时,它们会被放入另一个队列中,以便通过 gzip 或类似的方式延迟压缩。我的想法是:我希望对压缩队列中的对象进行弱引用,这样当压缩任务到达对象时,如果它已经消失,我们就不必费心压缩它——而且压缩队列也没有t 保持对象处于活动状态,否则会被 GC 处理。
那么如果恰好有一个 SoftReference 和一个 WeakReference,那么 SoftReference 的语义是否仍然适用?
我有一个从 Map 到 SoftReferences 的缓存。当它们被添加时,它们会被放入另一个队列中,以便通过 gzip 或类似的方式延迟压缩。我的想法是:我希望对压缩队列中的对象进行弱引用,这样当压缩任务到达对象时,如果它已经消失,我们就不必费心压缩它——而且压缩队列也没有t 保持对象处于活动状态,否则会被 GC 处理。
那么如果恰好有一个 SoftReference 和一个 WeakReference,那么 SoftReference 的语义是否仍然适用?
是的,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
是的,GC 对象没有任何问题,只要它有尽可能多的软/弱引用,直到它几乎有一个强引用。
你应该注意到,Weak Reference
总是在收集之前Soft Reference
。并且Soft Reference
经常用来缓存一些东西。
这意味着:那个时候,它不再需要生存,但是,在将来的某个时候,也许你会再次需要它,而 Java 将无法再次实例化一个新对象。