GC何时删除只有弱引用的对象



我有一个"有历史记录"的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停止世界暂停?

没有。

最新更新