你什么时候使用WeakHashMap或WeakReference?

问题

使用弱引用是我从未见过的实现,所以我试图弄清楚它们的用例是什么以及实现如何工作。什么时候需要使用aWeakHashMapWeakReference以及它是如何使用的?


#1 热门回答(88 赞)

强引用的一个问题是缓存,特别是对于像图像这样的非常大的结构。假设你有一个必须使用用户提供的图像的应用程序,例如我工作的网站设计工具。当然,你希望缓存这些图像,因为从磁盘加载它们非常昂贵,并且你希望避免在内存中同时存储两个(可能是巨大的)图像副本的可能性。因为当我们不是绝对需要时,图像缓存应该阻止我们重新加载图像,你会很快意识到缓存应该总是包含对已经在内存中的任何图像的引用。但是,对于普通的强引用,引用本身会强制图像保留在内存中,这需要你以某种方式确定内存中何时不再需要该图像并将其从缓存中删除,以使其符合垃圾收集条件。你被迫复制垃圾收集器的行为并手动确定对象是否应该在内存中。

Understanding Weak References,Ethan Nicholas


#2 热门回答(48 赞)

要明确的一个区别是aWeakReference和aSoftReference之间的区别。

基本上aWeakReference将由JVM热切地进行GC-d,一旦被引用的对象没有参考它。另一方面,ASoftReferenced对象往往会被垃圾收集器留下,直到它真的需要回收内存。

725131046值为**并在WeakReferences内保存的缓存将是非常无用的(在aWeakHashMap中,它是弱引用的键).SoftReferences在你希望实现可以使用可用内存增长和缩小的缓存时包装值很有用。


#3 热门回答(25 赞)

WeakReferences和WeakHashMap的一个常见用途是用于向对象添加属性。有时你希望向对象添加一些功能或数据,但子类和/或组合不是一个选项,在这种情况下,显而易见的事情是创建一个hashmap,将要扩展的对象链接到要添加的属性。然后,无论何时你需要房产,你都可以在 Map 上查找。但是,如果要添加属性的对象倾向于被破坏并且创建了很多,那么 Map 中的许多旧对象最终会占用大量内存。

如果你使用aWeakHashMap,则只要对象不再被你的程序的其余部分使用,对象就会离开你的 Map ,这是所需的行为。

我必须这样做才能添加一些数据到java.awt.Component来解决JRE在1.4.2和1.5之间的变化,我可以通过继承我感兴趣的每个组件来修复它(JButton,JFrame,JPanel ....)但这个使用更少的代码更容易。