我有一个带有历史记录的Java应用程序,并且它使用WeakReferences进行缓存。我进行了几次堆转储,发现所有堆转储都包含大量具有弱引用的对象(堆大小的10%-15%,约1.2GB)。
- 这是否意味着弱引用会对JVM产生内存压力?
- 并且会强制执行带有停顿的FullGC吗?
P.S. 我知道WeakReference对于CMS会产生性能损失,因为它使算法变得更加复杂。但是,是否有人看到过有关此问题的论文或一些官方信息?我只找到了这篇SO post。
我有一个带有历史记录的Java应用程序,并且它使用WeakReferences进行缓存。我进行了几次堆转储,发现所有堆转储都包含大量具有弱引用的对象(堆大小的10%-15%,约1.2GB)。
P.S. 我知道WeakReference对于CMS会产生性能损失,因为它使算法变得更加复杂。但是,是否有人看到过有关此问题的论文或一些官方信息?我只找到了这篇SO post。
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
这是不是意味着弱引用会在JVM上产生内存压力?
不。弱引用根本不影响垃圾收集。它们只是提供了一种跟踪对象的方式。
并且会导致停止所有操作的FullGC吗?
不会。