1

SoftReference, WeakReference,PhantomReference可用于自定义垃圾回收的过程。所有这些都扩展Reference<T>,因此可以将它们混合在单个集合中。硬引用(最常见的)没有扩展Reference<T>,因此不可能在一个集合中混合硬引用和其他类型的引用。我是对的,我们应该把CustomReference<T> extends Reference<T>所有类型的对象链接混合在单个集合中,我们应该把它放入集合中Collection<Reference<T>>吗?

更新:因此,在编写SSCCE时,我发现无法以Reference<T>通常的方式进行扩展(构造函数是包本地的)。

所以问题现在更新到以下内容:我可以使用单个集合类创建缓存,它总是保存一些对象(比如 10 个),而其他对象在内存不允许时由 GC 回收?除了为硬引用和软引用提供自定义包装器并将它们存储在集合中之外,还有其他方法可以做到这一点吗?

4

2 回答 2

2

当您希望被引用的对象保持活动状态直到主机进程的内存不足时,您可以使用SoftReference 。在收集器需要释放内存之前,该对象将不符合收集条件。松散地说,绑定一个 SoftReference 意味着,“固定对象,直到你不能了。”

相反,当您不想影响被引用对象的生命周期时,请使用Wea​​kReference ;您只想对引用的对象进行单独的断言,只要它仍然存在。对象的收集资格不受绑定的 WeakReferences 存在的影响。像从对象实例到相关属性的外部映射,只要相关对象还活着,就需要记录属性,这对于 WeakReferences 和 WeakHashMap 来说是一个很好的用途。

最后一个——PhantomReference——更难描述。与 WeakReference 一样,这种绑定的 PhantomReference 对被引用对象的生命周期没有影响。但与其他引用类型不同的是,我们甚至不能取消引用 PhantomReference。从某种意义上说,就调用者所知,它并不指向它所指向的东西。它只允许将一些相关数据与引用对象相关联——当 PhantomReference 在其相关的 ReferenceQueue 中排队时,这些数据可以在以后被检查和操作。通常从 PhantomReference 派生一个类型,并在该派生类型中包含一些附加数据。不幸的是,使用这种派生类型需要进行一些向下转换。

此链接中的更多信息

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

于 2011-06-24T06:23:21.433 回答
2

不幸的是,根据其 JavaDocReference<T>,大多数都不能(也不能)直接子类化:

因为引用对象是与垃圾收集器密切合作实现的,所以这个类不能直接子类化。

因此,您将无法在instanceof同一.Collection

您可以编写一个包装器,它要么使用两个单独Collection的对象来处理普通和软/弱/幻影引用,要么将它们全部放在同一个中Collection<Object>,并使用适当的instanceof检查和强制类型转换来区分对象。

于 2011-06-24T06:28:14.213 回答