所以我有一个从ORM / Hibernate
引用的对象链对于某些方法,我需要能够进行一些快速查找来识别密钥。
因此,我目前拥有所有具有Many的对象,能够快速查找内存中对象的Id,而无需在执行的生命周期中触发大量数据库查询螺纹
HashMap<Integer,Country> countriesTable
HashMap<Integer,State> statesTable
HashMap<Integer,City> citiesTable
HashMap<Integer,CityPart> citypartsTable
但是我担心的是循环引用被保留并且对象永远不会被垃圾收集清除,因为它们都通过ORM关系引用彼此并且它们都有指向eachohter的私有映射
现在我已经阅读了WeakHashMap,如果没有更强的引用,它将清除引用。
问题是在我的情况下使用WeakHashMap是否可取,或者Hashmap是否足够服务,这种设置和循环引用不会影响我的内存管理。
答案 0 :(得分:3)
如果你有3个对象构建一个隔离岛(A->B->C->A
)并且没有其他任何东西被引用,那么垃圾收集可以毫无问题地抛弃所有这些对象。
但是WeakHashMap
对你的情况没有帮助,因为在WeakHashMap
中只有弱键被引用。 (来自WeakHashMap
JavaDoc的第一句话是“基于哈希表的Map接口实现,带有弱键。”)这些值仍然是硬引用。因此WeakHashMap
对您的情况无济于事。如果用作键的Integer对象不是从其他地方引用的,e。 G。从对象内部来看,它更糟糕,因为它们最终有资格收集垃圾并扔掉。
如果您的Integer对象未在其他任何地方被引用,那么您需要的是正常HashMap
;如果这些对象是从您的对象中引用的对象,您还需要包含该WeakHashMap
WeakReference
实例中的值,然后从地图中检索对象时检查它们是否仍然可用或是否已收集垃圾。