Java 在一个集合中混合不同的引用类型

Java 在一个集合中混合不同的引用类型,java,garbage-collection,weak-references,soft-references,phantom-reference,Java,Garbage Collection,Weak References,Soft References,Phantom Reference,SoftReference,WeakReference,PhantomReference可用于定制垃圾收集过程。它们都扩展了Reference,因此可以在单个集合中混合使用。硬引用(最常见的引用)不扩展引用,因此不可能在一个集合中混合硬引用和其他类型的引用。我说得对吗?我们应该将CustomReference extensed Reference添加到集合中,以便在单个集合中混合所有类型的对象链接(collection)达到预期效果 更新:所以在编写时,我发现不可能以通常的方式扩展Referen

SoftReference
WeakReference
PhantomReference
可用于定制垃圾收集过程。它们都扩展了
Reference
,因此可以在单个集合中混合使用。硬引用(最常见的引用)不扩展
引用
,因此不可能在一个集合中混合硬引用和其他类型的引用。我说得对吗?我们应该将
CustomReference extensed Reference
添加到集合中,以便在单个集合中混合所有类型的对象链接(
collection
)达到预期效果

更新:所以在编写时,我发现不可能以通常的方式扩展
Reference
(构造函数是包本地的)


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

当您希望引用的对象保持活动状态直到主机进程内存不足时,您可以使用软引用。在收集器需要释放内存之前,对象将不符合收集条件。笼统地说,绑定SoftReference意味着“锁定对象,直到无法再锁定为止。”

相反,如果不想影响引用对象的生存期,请使用WeakReference;您只需要对引用的对象进行单独的断言,只要它保持活动状态。对象的收集资格不受绑定WeakReference的影响。类似于从对象实例到相关属性的外部映射,只要相关对象处于活动状态,就只需要记录属性,这是WeakReferences和WeakHashMap的一个很好的用途

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

更多信息在此

增加了一个链接

当您希望被引用对象保持活动状态直到主机进程内存不足时,可以使用软引用。在收集器需要释放内存之前,对象将不符合收集条件。笼统地说,绑定SoftReference意味着“锁定对象,直到无法再锁定为止。”

相反,如果不想影响引用对象的生存期,请使用WeakReference;您只需要对引用的对象进行单独的断言,只要它保持活动状态。对象的收集资格不受绑定WeakReference的影响。类似于从对象实例到相关属性的外部映射,只要相关对象处于活动状态,就只需要记录属性,这是WeakReferences和WeakHashMap的一个很好的用途

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

更多信息在此

增加了一个链接

不幸的是,
参考
大多数不能(也不能)直接子类,根据:

由于引用对象是与垃圾收集器密切协作实现的,所以此类不能直接子类化

因此,在同一个
集合中,您将无法轻松处理软/弱/幻影引用和正常引用(即没有难看的
实例
+casting)


您可以编写一个包装器,使用两个独立的
集合
对象来处理普通引用和软/弱/幻影引用,或者将它们全部放入同一个
集合
,并使用适当的
实例对类型转换进行检查以区分对象。

不幸的是
引用
大多数对象都不是这样(且不能)根据以下规定直接细分:

由于引用对象是与垃圾收集器密切协作实现的,所以此类不能直接子类化

因此,在同一个
集合中,您将无法轻松处理软/弱/幻影引用和正常引用(即没有难看的
实例
+casting)

您可以编写一个包装器,使用两个单独的
集合
对象来处理普通引用和软/弱/幻影引用,或者将它们全部放入同一个
集合
,并使用适当的
实例
检查和强制转换来区分