【问题标题】:Reduce Memory Usage With WeakHashMap使用 Wea​​kHashMap 减少内存使用
【发布时间】:2010-03-18 21:19:40
【问题描述】:

WeakHashMap.html的Javadoc中,它说

"WeakHashMap 中的每个关键对象都是 间接存储为 弱参考。因此,一个密钥将 只有在之后才会自动删除 对它的弱引用,都在里面 在地图之外,已经 被垃圾收集器清除。”

然后

请注意,值对象可能会引用 通过 WeakHashMap 本身;也就是一个值 对象可能强烈引用某些 其他关联的关键对象 反过来,值对象强烈引用 到第一个值对象的键。

但是在WeakHashMap中不应该同时使用Key和Value吗? 即如果内存不足,GC 将释放值对象持有的内存(因为在大多数情况下,值对象很可能比键对象占用更多的内存)?

如果 GC 释放 Value 对象,Key 对象也可以释放?

基本上,我正在寻找一个 HashMap,它会在内存不足时减少内存使用(GC 会在必要时收集值和键对象)。

在 Java 中可以吗?

谢谢。

【问题讨论】:

    标签: java garbage-collection weakhashmap


    【解决方案1】:

    弱引用不适合缓存 - NetBeans 会这样做,而且可能会很傻。

    SoftReference 是你想要的。实际上很难做到正确 - 所以复制别人的解决方案。有些人建议自己明确管理缓存。

    References 仅适用于单个引用。有人提议在 Java SE 中添加“ephemerons”,但我还没有看到任何实现。

    【讨论】:

    • 到目前为止,我还没有听说过关于 SoftReference 的好消息。他们等到堆变得稀少被释放,性能由于增加的 GC 活动而受到影响(好吧,也许在你的情况下它会正常工作)。你也可以使用 LRU map 之类的东西。 Ehcache也是一种可能的解决方案。
    【解决方案2】:

    这个想法是,您可以将此 Map 用作“查找”数据结构,它只保持仍然可以引用的键值对(通过键)。尽管如此,虽然基本想法很好,但我记得它并没有我希望的那么有用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-05-21
      • 2014-01-19
      • 2011-09-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多