【问题标题】:WeakHashMap or HashMap?弱哈希映射还是哈希映射?
【发布时间】:2016-04-12 13:19:47
【问题描述】:

所以我有一个从 ORM / Hibernate 相互引用的对象链

  • 大陆
    • 有很多国家
    • 有很多州
    • 有很多城市
    • 有许多城市区域
  • 国家
    • 有一个国家
    • 有很多州
    • 有很多城市
    • 有许多城市区域
  • 状态
    • 有一个大陆
    • 有一个国家
    • 有很多城市
    • 有许多城市区域
  • 城市
    • 有一个大陆
    • 有一个国家
    • 有一个州
    • 有许多城市区域
  • 城市部分
    • 有一个大陆
    • 有一个国家
    • 有一个州
    • 有一个城市

对于某些方法,我需要能够进行一些快速查找以识别键。

因此,我目前在所有具有 Many 的对象中都能够快速查找内存中对象的 Id,而无需在执行线程的生命周期内触发大量数据库查询

HashMap<Integer,Country>     countriesTable
HashMap<Integer,State>       statesTable
HashMap<Integer,City>        citiesTable
HashMap<Integer,CityPart>    citypartsTable

但我担心的是循环引用被持有,并且对象永远不会被垃圾收集清除,因为它们都通过 ORM 关系相互引用,并且它们都有指向 eachohter 的私有映射

现在我已经阅读了有关 WeakHashMap 的信息,如果没有更多的强引用,它将清除引用。

问题是在我的情况下使用 Wea​​kHashMap 是否值得推荐,或者 Hashmap 是否可以为我提供足够的服务,并且这种设置和循环引用不会影响我的内存管理。

【问题讨论】:

  • 有什么方法可以改变你的设计来消除循环引用?
  • 循环引用不会停止垃圾收集(尽管出于其他原因它们通常不是一个好主意)。 WeakHashMap 不是一个好的缓存解决方案。在您可以证明进行数据库查找的“正确”解决方案不起作用之前,您不应该考虑缓存。
  • 此外,由于您开始拥有这些结构,您可以很好地使用同步工厂方法来获取实例,并让工厂方法在创建新实例之前检查实例是否已经存在(因此您确保每个实体都有一个实例)。重要提示:过早的优化是 99% 万恶之源。
  • 此外,Hibernate 有自己的缓存解决方案,大多数现代 JDBC 驱动程序也有。很有可能你真的完全不需要担心这个。
  • 如果循环引用会导致垃圾收集问题,那么 ORM 工具中的所有双向映射都将是即时内存泄漏。相信你使用的工具,不相信你编写的未经测试的代码。

标签: java hibernate hashmap weak-references weakhashmap


【解决方案1】:

如果您有 3 个对象构建了一个隔离岛 (A-&gt;B-&gt;C-&gt;A),并且这些对象都没有从其他任何地方引用,那么垃圾收集可以毫无问题地将它们全部丢弃。

但是WeakHashMap 对您的情况没有帮助,因为在WeakHashMap 中只有键被弱引用。 (WeakHashMap JavaDoc 的第一句话是“Map 接口的基于哈希表的实现,带有弱键。”)这些值仍然是硬引用。因此,WeakHashMap 对您的情况没有帮助。如果用作键的 Integer 对象没有从其他地方引用,例如。 G。从对象内部情况更糟,因为它们有资格进行垃圾收集并最终被丢弃。

如果您的 Integer 对象没有在其他任何地方被引用,您需要的是一个普通的HashMap,或者如果这些对象是从您的对象中引用的对象,那么您需要一个 WeakHashMap,但您还必须将值包装在 @987654328 @ 实例,然后在从地图中检索对象时检查它们是否仍然可用或已被垃圾收集。

【讨论】:

  • 好吧,只要我保持隔离岛,我应该很好?
  • 正如我所说,孤立岛可以进行垃圾收集。但是,如果您在 WeakHashMap 中有这些对象之一,则它们不会被垃圾收集,因为这些对象之一是硬引用,因此它们不再是孤立的。跨度>
  • 但是你也可以有一个弱引用或软引用的普通哈希图。
  • 是的,他可以,正如我在回答中所描述的那样。 ;-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-13
  • 1970-01-01
  • 2016-04-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多