我有一个从Map到SoftReferences构建的缓存。 添加它们后,它们被放入另一个队列中,并通过gzip或类似方法进行延迟压缩。
我的想法是:我想对压缩队列中的对象具有WeakReferences,以便当压缩器任务到达该对象时,如果该对象已经消失,我们就不必费心压缩它-而且压缩器的队列也不需要这样做。 保持对象存活,否则将被GC处理。
因此,如果恰好有一个SoftReference和一个WeakReference,SoftReference的语义是否仍然适用?
海湾合作委员会? 我想您只是说GC,当大多数人看到GCC时,他们就会想到Gnu编译器集合。
哈哈,我是说真的。 晚了; 谢谢。
是的,SoftReferences的语义仍然适用:SoftReferences比WeakReferences强。
对于GC,基本上将WeakReferences视为不存在。因此,可能难以访问的对象只能立即被GC。但是,只有需要完全满足对内存的需求时,才可以将SoftReferences作为最强类型访问的对象用于GCing。
因此,如果同时存在软引用和弱引用,则将应用SoftReference的语义。
Weak reference objects, which do not
prevent their referents from being
made finalizable, finalized, and then
reclaimed.
http://download.oracle.com/javase/6/docs/api/java/lang/ref/WeakReference.html
Soft reference objects, which are
cleared at the discretion of the
garbage collector in response to
memory demand. Soft references are
most often used to implement
memory-sensitive caches.
http://download.oracle.com/javase/6/docs/api/java/lang/ref/SoftReference.html
是的,对于拥有任意数量的软/弱引用的对象,GC几乎没有问题,直到它拥有几乎一个强引用。
您应该注意,Weak Reference总是在Soft Reference之前收集。而且Soft Reference通常用于缓存内容。
这意味着:那时,它不再需要生存,但是在将来的某个时候,也许您再次需要它,而Java将无法再次工作以实例化新对象。