通知每个持有B对象引用的A对象已删除B对象

时间:2017-12-25 21:53:28

标签: java garbage-collection

一定要很难理解我的意思,但我会尝试解释。

我们有一个班级Person,其中包含各种字段:namesurnameage等。这些是任何给定Person的独特特征。但是,让我们考虑一下,每个Person都有一个引用类House的另一个对象的字段。有些人拥有它,这意味着一些House对象引用,其他人没有,这意味着Null对象引用(抱歉)。另一件事是我们假设有些人住在同一个房子里,这意味着来自不同House对象的同一Person的多个引用。到目前为止一切都很好。

现在,我们处于这样一种情况:一个火热的Asteroid物体飞过天空并破坏了一个漂亮的多层House物体,其中有许多Person个物体居住。 Asteroid使用Town对象对此建筑的引用,并将其设置为Null。但是,可怜的Person对象仍然认为他们有HouseHouse的引用仅在Town的级别上更改,因此它仍然在内存中每个居民都提到它。这意味着垃圾收集器无法摆脱House对象,Person对象仍然可以使用伪现有House

我认为现在的问题很清楚。我们该如何处理这种情况?

我想过使用一些boolean旗帜:true如果存在,false如果没有,当Person来到火山口时曾经是他们的{ {1}},他们将引用设置为House,因为不再存在此类对象。它提供了一个解决方案,但垃圾收集器将无法摆脱该对象,因为并非每个居民都确保Null不存在。

另一种解决方案可能是House对象具有对驻留在其中的所有House个对象的引用数组。在Person被销毁之后,我们将所有引用设置为House,遍历数组。现在垃圾收集器很容易摆脱对象,但这可能代价高昂:如果它是摩天大楼呢?

还有其他可能性吗?

2 个答案:

答案 0 :(得分:2)

如你所说,你可以在House上使用旗帜。 要解决垃圾收集器的问题,只需连接House和Person WeakReference。 当对象只有弱传入引用时,它有资格进行垃圾回收。

答案 1 :(得分:0)

  

另一种解决方案可能是House对象具有对驻留在其中的所有Person对象的引用数组。众议院被摧毁后,我们将所有引用设置为Null,遍历数组。现在垃圾收集器很容易摆脱对象,但这可能代价高昂:如果它是摩天大楼呢?

这可能代价高昂,但不会大幅增加整体成本。

关于记忆,如果您的摩天大楼有一个长度为N的列表,那么有N个人参考它。这意味着您只将参考总数增加了一倍。

关于时间,它大致相同:你需要清理N个引用,但这些引用必须先设置。所以,你只是将工作加倍。

加倍听起来很糟糕,但是你的价值可能会翻倍。

请注意,WeakReference也不是免费的。用弱引用替换House的常规引用意味着再增加一个对象,这比(强)引用更昂贵。

如果你真的想节省内存,那么将List<Person>存储在House肯定是更好的方式。

它还提供了这样一个列表的优势,这可能有用一天。冗余很糟糕,因为您始终必须保持前向和后向引用同步。