我有一个"有历史记录"的java应用程序,它使用WeakReferences进行缓存。我做了几个堆转储,发现它们都包含很多弱引用的对象(堆大小的10%-15%,~1.2GB)
- 这是否意味着弱引用会给JVM带来内存压力
- 并迫使FullGC停止世界暂停
附言:我知道WeakReference会对CMS的GC产生性能惩罚,因为这会使算法更加困难。但是,有人看到一篇论文或一些官方信息吗?我只找到了这个SO帖子。
Object Computing,股份有限公司做了一个我过去觉得有用的演示。摘录如下:
对象引用的种类
- 强有力的参考
- SoftReference
- GC在没有对引用对象的强引用之后的任何时间都会被丢弃,但通常会被保留到内存不足为止
- 可以用于实现对象的缓存,如果需要,可以重新创建这些缓存
弱参考
- GC在没有对引用对象的强引用或软引用之后的任何时间
- 通常用于"规范映射",其中每个对象具有唯一标识符(一对一),并且位于"侦听器"的集合中
对于软引用和弱引用,当引用对象被GC’ed时,get返回null方法。
来源:http://java.ociweb.com/mark/other-presentations/JavaGC.pdf
这似乎表明SoftReference是缓存对象的首选。
在实践中,我使用了Guava缓存API,并让它管理细节:https://github.com/google/guava/wiki/CachesExplained
这是否意味着弱引用会给JVM带来内存压力?
没有。弱引用根本不会影响GC。他们只是给了你一个追踪它的方法。
并迫使FullGC停止世界暂停?
没有。