一定要很难理解我的意思,但我会尝试解释。
我们有一个班级Person
,其中包含各种字段:name
,surname
,age
等。这些是任何给定Person
的独特特征。但是,让我们考虑一下,每个Person
都有一个引用类House
的另一个对象的字段。有些人拥有它,这意味着一些House
对象引用,其他人没有,这意味着Null
对象引用(抱歉)。另一件事是我们假设有些人住在同一个房子里,这意味着来自不同House
对象的同一Person
的多个引用。到目前为止一切都很好。
现在,我们处于这样一种情况:一个火热的Asteroid
物体飞过天空并破坏了一个漂亮的多层House
物体,其中有许多Person
个物体居住。 Asteroid
使用Town
对象对此建筑的引用,并将其设置为Null
。但是,可怜的Person
对象仍然认为他们有House
:House
的引用仅在Town
的级别上更改,因此它仍然在内存中每个居民都提到它。这意味着垃圾收集器无法摆脱House
对象,Person
对象仍然可以使用伪现有House
。
我认为现在的问题很清楚。我们该如何处理这种情况?
我想过使用一些boolean
旗帜:true
如果存在,false
如果没有,当Person
来到火山口时曾经是他们的{ {1}},他们将引用设置为House
,因为不再存在此类对象。它提供了一个解决方案,但垃圾收集器将无法摆脱该对象,因为并非每个居民都确保Null
不存在。
另一种解决方案可能是House
对象具有对驻留在其中的所有House
个对象的引用数组。在Person
被销毁之后,我们将所有引用设置为House
,遍历数组。现在垃圾收集器很容易摆脱对象,但这可能代价高昂:如果它是摩天大楼呢?
还有其他可能性吗?
答案 0 :(得分:2)
如你所说,你可以在House上使用旗帜。
要解决垃圾收集器的问题,只需连接House和Person
WeakReference
。
当对象只有弱传入引用时,它有资格进行垃圾回收。
答案 1 :(得分:0)
另一种解决方案可能是House对象具有对驻留在其中的所有Person对象的引用数组。众议院被摧毁后,我们将所有引用设置为Null,遍历数组。现在垃圾收集器很容易摆脱对象,但这可能代价高昂:如果它是摩天大楼呢?
这可能代价高昂,但不会大幅增加整体成本。
关于记忆,如果您的摩天大楼有一个长度为N的列表,那么有N个人参考它。这意味着您只将参考总数增加了一倍。
关于时间,它大致相同:你需要清理N个引用,但这些引用必须先设置。所以,你只是将工作加倍。
加倍听起来很糟糕,但是你的价值可能会翻倍。
请注意,WeakReference
也不是免费的。用弱引用替换House
的常规引用意味着再增加一个对象,这比(强)引用更昂贵。
如果你真的想节省内存,那么将List<Person>
存储在House
肯定是更好的方式。
它还提供了这样一个列表的优势,这可能有用一天。冗余很糟糕,因为您始终必须保持前向和后向引用同步。