【问题标题】:When does GC remove objects that have only weak references?GC 什么时候删除只有弱引用的对象?
【发布时间】:2023-03-08 03:42:01
【问题描述】:

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

  • 是否意味着弱引用会对JVM产生内存压力?
  • 并强制使用 stop-the-world 暂停的 FullGC?

附:我知道 WeakReference 会对 CMS 的 GC 产生性能损失,因为它使算法更难。但是有人看过一篇论文或一些关于它的官方信息吗?我只找到了这个SO post

【问题讨论】:

    标签: java garbage-collection


    【解决方案1】:

    Object Computing, Inc. 对此做了一个演示,我在过去发现它很有用。摘录如下:

    对象引用的种类

    • 强引用
    • 软参考
    • 在没有对所指对象的强引用后随时进行 GC,但通常会保留到内存不足
    • 可用于实现可在需要时重新创建的对象的缓存

    弱引用

    • 在没有对引用对象的强引用或软引用后的任何时间进行 GC
    • 通常用于“规范映射”,其中每个对象 具有唯一标识符(一对一),并且在“侦听器”的集合中

    "对于软引用和弱引用,当引用对象被 GC 后,get 返回 null 方法。"

    来源:http://java.ociweb.com/mark/other-presentations/JavaGC.pdf

    这似乎表明 SoftReference 是缓存对象的首选。

    在实践中,我使用了 Guava 缓存 API 并让它管理细节: https://github.com/google/guava/wiki/CachesExplained

    【讨论】:

    • 感谢您的回答,但它没有回答我的问题 :) 对于缓存,我更喜欢 Encache,因为它有很多选项、Bean、统计信息等。但如果这个话题我很感兴趣 when GC 删除带有 WeakReference 的对象。
    【解决方案2】:

    是否意味着弱引用会对JVM产生内存压力?

    没有。弱引用根本不影响 GC。它们只是为您提供了一种跟踪它的方法。

    并强制使用 stop-the-world 暂停的 FullGC?

    没有。

    【讨论】:

    • 那么从 GC 性能的角度来看,使用和不使用 Wea​​kReference 没有区别吗?并且移除 WeakReference 并不会提高性能?
    • 你知道GC什么时候用WeakReference清理对象吗?例如在 CMS 算法中。
    • 我已经回答了你的第一个问题。第二个问题的答案基本上是“随心所欲”。
    猜你喜欢
    • 2016-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多