我有一个带有历史记录的java应用程序,它使用WeakReferences进行缓存。我做了几个heapdumps,发现它们都包含很多带有弱引用的对象(堆大小的10%-15%,大约1.2GB)。
P.S。我知道WeakReference会为CMS的GC产生性能损失,因为它会使算法更难。但有人看到一篇论文或一些关于它的官方信息吗?我发现只有SO post。
答案 0 :(得分:1)
Object Computing,Inc。做了一个关于这个的演示文稿,我发现它在过去很有用。这是一段摘录:
各种对象引用
- 强参考
- SoftReference的
- GC'在任何时候没有强烈引用指示物之后,但通常会保留直到内存不足
- 可用于实现可在需要时重新创建的对象的缓存
WeakRefernence
- GC'在任何时候没有对引用的强烈或软引用
- 经常用于每个对象的“规范映射” 有一个唯一的标识符(一对一),以及“听众”的集合
“对于软引用和弱引用,当引用对象已经GC时,get返回null方法。”
消息来源:http://java.ociweb.com/mark/other-presentations/JavaGC.pdf
这似乎表明 SoftReference 是缓存对象的首选。
在实践中,我使用了Guava缓存API并让它管理细节: https://github.com/google/guava/wiki/CachesExplained
答案 1 :(得分:1)
这是否意味着弱引用会对JVM产生内存压力?
没有。弱引用根本不会影响GC。他们只是给你一种跟踪它的方法。
迫使FullGC停止世界停顿?
没有