SoftReference
,WeakReference
,PhantomReference
可用于自定义垃圾回收过程。所有这些都扩展Reference<T>
因此可以在单个集合中混合它们。硬引用(最常见的引用)不会扩展Reference<T>
,因此无法在一个集合中混合使用硬引用和其他类型的引用。我是对的,我们应该将CustomReference<T> extends Reference<T>
放到集合中,以便在单个集合(Collection<Reference<T>>
)中实现混合所有类型的对象链接的预期结果吗?
更新:所以在编写SSCCE时,我发现无法以通常的方式扩展Reference<T>
(构造函数是包本地的)。
所以问题现在更新到以下内容:我可以使用单个集合类创建缓存,它始终包含一些对象(例如10个),而当内存不允许时,GC会回收其他对象吗?除了为硬引用和软引用提供自定义包装并将它们存储在集合中之外,还有其他方法吗?
答案 0 :(得分:2)
如果希望引用的对象保持活动状态,直到主机进程内存不足,则使用 SoftReference 。在收集器需要释放内存之前,该对象将无法进行收集。松散地说,绑定SoftReference意味着“将对象钉住,直到你再也不能。”
相反,当您不想影响引用对象的生命周期时,请使用 WeakReference ;你只想对引用的对象做一个单独的断言,只要它仍然存活。对象的收集资格不受绑定WeakReferences的影响。类似于从对象实例到相关属性的外部映射,只要相关对象处于活动状态,就只需要记录属性,这对于WeakReferences和WeakHashMap来说是一个很好的用途。
最后一个 - PhantomReference - 难以刻画。与WeakReference一样,这样的绑定PhantomReference对引用对象的生命周期没有任何影响。但与其他引用类型不同,人们甚至无法取消引用PhantomReference。从某种意义上说,就呼叫者而言,它并不指向它指向的东西。它只允许将一些相关数据与引用的对象相关联 - 当PhantomReference在其相关的ReferenceQueue中排队时,以后可以检查和处理的数据。通常,从PhantomReference派生类型,并在该派生类型中包含一些附加数据。不幸的是,使用这种衍生类型需要一些向下倾斜。
此link
中的详细信息http://download.oracle.com/javase/7/docs/api/java/lang/ref/package-summary.html
添加了一个链接 http://weblogs.java.net/blog/enicholas/archive/2006/05/understanding_w.html
答案 1 :(得分:2)
不幸的是Reference<T>
根据its JavaDoc,大多数不能(也不能)直接进行子类化:
由于引用对象是与垃圾收集器密切配合实现的,因此该类可能不会直接进行子类化。
因此,您将无法轻松(即,没有丑陋的instanceof
+强制转换)处理同一{{1}中的软/弱/幻像引用和正常引用}。
您可以编写一个包装器, 使用两个单独的Collection
对象来处理正常和软/弱/幻像引用或,将它们全部放入相同的Collection
并使用适当的Collection<Object>
检查和强制转换来区分对象。