Java - 观察WeakReference以获取垃圾收集时的引用?

时间:2016-11-04 11:31:18

标签: java

我想知道是否有办法观察"或"听"由于被垃圾收集而从WeakReference移除了所指对象的时间到WeakReference

当对象的WeakReference的指示对象被处理掉时,我只需要一种有效的方法从WeakReference中删除对象(包含List)。

我目前有一个迭代List的任务,检查列表中每个对象的WeakReference的状态,但是如果可能的话,我想抛弃该系统。

谢谢!

3 个答案:

答案 0 :(得分:2)

https://docs.oracle.com/javase/7/docs/api/java/lang/ref/ReferenceQueue.html应该用于满足您的要求。

请参阅http://www2.sys-con.com/itsg/virtualcd/java/archives/0507/shields/index.html如何使用ReferenceQueue和SoftReference编写缓存。

来自guava的

com.google.common.cache.CacheBuilder能够创建使用软引用或弱引用的缓存。使用CacheBuilder,您不需要自己处理实现细节 - 您将获得可以使用的缓存。

另一种选择是使用java.util.WeakHashMap

答案 1 :(得分:1)

允许运行时系统(垃圾收集器)在任何给定时间点“收集”垃圾。据我所知,没有你可以依赖的机制。

换句话说:您的民意调查方法是唯一的选择。

你可以尝试更多的hackish(或者称之为实用)这样的事情:

  1. 对System.gc()的独特调用
  2. 也许是一些短暂的睡眠
  3. 检查该清单
  4. 增加查找需要从列表中删除的项目的机会。但也许真正的重点是:你为什么关心:你的名单是如此巨大,以至于你因为当前的实施而一直遇到问题?

    最后,另一个想法:如果你担心有一些“外部”代码需要一直轮询你的列表;你也可以创建自己的List实现......就是这样:它为你给它的对象使用WeakReferences;并且它会在封面下进行所有定期扫描 - 这样您的应用程序逻辑就需要明确地执行此操作。

答案 2 :(得分:0)

这就是PhantomReference的用途。它不会阻止对象被回收,但是当它被回收时,它被放到ReferenceQueue,您可以在那里执行任何必要的操作(或者只是忽略它)。