因此,我有一个从ORM/HHibernate 相互引用的对象链
- 欧洲大陆
- 有许多国家
- 有许多州
- 有很多城市
- 有许多城市部分
- 国家
- 有一个国家
- 有许多州
- 有很多城市
- 有许多城市部分
- 州
- 有一个大陆
- 有一个国家
- 有很多城市
- 有许多城市部分
- 城市
- 有一个大陆
- 有一个国家
- 有一个州
- 有许多城市部分
- 城市部分
- 有一个大陆
- 有一个国家
- 有一个州
- 有一个城市
对于某些方法,我需要能够进行一些快速查找来识别键。
因此,我目前在所有具有Many的对象中都可以快速查找内存中对象的Id,而无需在执行线程的生命周期内启动大量数据库查询
HashMap<Integer,Country> countriesTable
HashMap<Integer,State> statesTable
HashMap<Integer,City> citiesTable
HashMap<Integer,CityPart> citypartsTable
但我担心的是循环引用被保留,对象永远不会被垃圾收集清除,因为它们都通过ORM关系相互引用,并且都有指向每个的私有映射
现在我读到了关于WeakHashMap的文章,如果没有更多的强引用,它将清除引用。
问题是在我的情况下是否建议使用WeakHashMap,或者Hashmap是否足以为我提供服务,并且这种设置和循环引用不会损害我的内存管理。
如果有3个对象构建了一个隔离岛(A->B->C->A
),而这些对象都没有从其他任何地方引用,那么垃圾收集可以毫无问题地将它们全部丢弃。
但是WeakHashMap
对您的情况没有帮助,因为在WeakHashMap
中,只有键被弱引用。(WeakHashMap
JavaDoc的第一句话是"Map接口的基于哈希表的实现,带有弱键。")这些值仍然是硬引用。所以WeakHashMap
对你的情况没有帮助。如果用作键的Integer对象没有从其他地方引用,例如从对象内部引用,情况会更糟,因为它们最终有资格进行垃圾收集和丢弃。
如果Integer对象没有在其他地方引用,则需要一个普通的HashMap
;如果这些对象是从对象中引用的对象,则需要WeakHashMap
,但您还必须将值包装在WeakReference
实例中,然后在从映射检索对象时,检查它们是否仍然可用或已被垃圾收集。