GC什么时候删除只有弱引用的对象?

时间:2015-11-12 18:07:16

标签: java garbage-collection

我有一个带有历史记录的java应用程序,它使用WeakReferences进行缓存。我做了几个heapdumps,发现它们都包含很多带有弱引用的对象(堆大小的10%-15%,大约1.2GB)。

  • 这是否意味着弱引用会对JVM产生内存压力?
  • 强迫FullGC停止世界停顿?

P.S。我知道WeakReference会为CMS的GC产生性能损失,因为它会使算法更难。但有人看到一篇论文或一些关于它的官方信息吗?我发现只有SO post

2 个答案:

答案 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停止世界停顿?

没有