18b*_*tes 19 java weak-references
我知道弱引用受到垃圾收集器的支配,我们不能保证弱引用会存在.我看不出需要弱参考,但确定应该有理由.
Voo*_*Voo 17
使用弱哈希映射实际上通常是一个坏主意.一方面容易出错,但更糟糕的是它通常用于实现某种缓存.
这意味着以下内容:您的程序在一段时间内运行良好且性能良好,在压力下我们分配越来越多的内存(更多请求=更多内存压力=可能更多缓存条目),然后导致GC.
现在,当您的系统处于高压力状态时,您不仅会获得GC,而且还会丢失整个缓存,就在您最需要它时.这个问题并不好玩,所以你至少必须使用一个合理大小的硬引用LRU缓存来缓解这个问题 - 你仍然可以使用weakrefs,但仅作为额外的帮助.
我看过不止一个项目被"虫子"击中..
我见过的最简单明智的弱引用使用是Guava Striped,它会锁定条带.基本上,如果没有线程当前持有对锁变量的引用,那么没有理由保持锁定,是吗?这个锁可能在过去曾被使用过,但现在没必要了.
如果我必须在你使用它的时候给出一个规则,我会说当你将来可能会使用某些东西时,软引用是可取的,但是如果你真的需要它可以重新计算它; 当您可以确定在引用内存不足后永远不需要该值时,弱引用尤其可取.(例如,如果equals(Object)对映射键类型的特定实现使用默认引用相等性,并且该对象在其他任何位置停止引用,则可以确保该条目永远不会再次引用.
我使用弱引用的主要原因是通过 WeakHashMap 间接使用。
您可能希望在 Map 中存储一组对象(作为缓存或出于任何其他原因),但不希望它们在 Map 存在时一直在内存中,尤其是在对象相对较大的情况下。
通过使用 WeakHashMap,您可以确保来自 Map 的引用不是将对象保留在内存中的唯一原因,因为如果不存在其他引用,它将被垃圾收集。