GC何时删除仅具有弱引用的对象?

4

我有一个带有历史记录的Java应用程序,并且它使用WeakReferences进行缓存。我进行了几次堆转储,发现所有堆转储都包含大量具有弱引用的对象(堆大小的10%-15%,约1.2GB)。

  • 这是否意味着弱引用会对JVM产生内存压力?
  • 并且会强制执行带有停顿的FullGC吗?

P.S. 我知道WeakReference对于CMS会产生性能损失,因为它使算法变得更加复杂。但是,是否有人看到过有关此问题的论文或一些官方信息?我只找到了这篇SO post

2个回答

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


谢谢您的回答,但它并没有回答我的问题 :) 对于缓存,我更喜欢Encache,因为它有很多选项,Beans,统计数据等。但是在这个话题的情况下,我对问题“何时”GC删除具有WeakReference的对象感兴趣。 - Jimilian

1

这是不是意味着弱引用会在JVM上产生内存压力?

不。弱引用根本不影响垃圾收集。它们只是提供了一种跟踪对象的方式。

并且会导致停止所有操作的FullGC吗?

不会。


从垃圾回收性能的角度来看,使用WeakReference和不使用WeakReference之间没有区别吗?移除WeakReference并不能提高性能吗? - Jimilian
你知道GC何时清理带有WeakReference的对象吗?例如,在CMS算法中。 - Jimilian
我已经回答了你的第一个问题。对于第二个问题的答案基本上是“每当它想”。 - user207421

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接