弱引用和软引用都不太适合这种情况。WeakReferences 往往会在对象不再有更强的引用时立即被清除,而软引用只有在堆增长到最大大小并且需要抛出 OutOufMemoryError 时才会被清除。
通常,使用基于时间的方法和常规强引用更有效,这对于 VM 来说比 Reference 子类便宜得多(程序和 GC 处理速度更快,并且不为引用本身使用额外的内存。)。即释放一段时间内未使用的所有对象。您可以使用定期 TimerTask 来检查这一点,无论如何您都需要它来操作您的参考队列。这个想法是,如果创建对象需要 10 毫秒,并且在它最后一次使用后最多保留 1 秒,那么平均只比永久保留所有对象慢 1%。但是由于它很可能会使用更少的内存,因此实际上会更快。
编辑:实现这一点的一种方法是在内部使用 3 个存储桶。放入缓存的对象总是插入到存储桶 0 中。当请求一个对象时,缓存会按顺序在所有 3 个存储桶中查找它,如果它不存在,则将其放入存储桶 0。TimerTask 以固定的时间间隔被调用,只是丢弃桶 2 并在桶列表的前面放置一个新的空桶,这样新的桶 0 将是空的,以前的桶 0 变为 1,以前的桶 1 现在是桶2. 这将确保空闲对象将在至少一个和至多两个计时器间隔中存活,并且每个间隔访问不止一次的对象可以非常快速地检索。这种数据结构的总维护开销将大大小于基于引用对象和引用队列的所有内容。