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

Java 通知持有对B对象引用的每个A对象B对象已被删除,java,garbage-collection,Java,Garbage Collection,我一定很难理解这个标题的意思,但我会尽力解释 我们有一个类Person,它包含各种字段:姓名,姓氏,年龄等等。这些是任何给定的人的独特特征。但是,让我们考虑一下,每一个人>代码>都有一个字段引用了另一个类的对象房子< /代码>。有些人有它,这意味着一些房子对象引用,其他人没有,这意味着空对象引用(对此表示抱歉)。另一件事是,我们假设一些人住在同一所房子里,这意味着从不同的人对象多次引用同一房子。到目前为止还不错 现在,我们所处的情况是,一颗炽热的小行星飞过天空,摧毁了一座美丽的多层房屋,那里居住

我一定很难理解这个标题的意思,但我会尽力解释

我们有一个类
Person
,它包含各种字段:
姓名
姓氏
年龄
等等。这些是任何给定的
人的独特特征。但是,让我们考虑一下,每一个<代码>人>代码>都有一个字段引用了另一个类的对象<代码>房子< /代码>。有些人有它,这意味着一些
房子
对象引用,其他人没有,这意味着
对象引用(对此表示抱歉)。另一件事是,我们假设一些人住在同一所房子里,这意味着从不同的
对象多次引用同一
房子
。到目前为止还不错

现在,我们所处的情况是,一颗炽热的小行星飞过天空,摧毁了一座美丽的多层房屋,那里居住着许多人
Asteroid
使用
Town
对象对该建筑的引用,并将其设置为
Null
。然而,贫穷的
对象仍然认为他们有一所
房子
房子
的参考仅在
城镇
级别更改,因此它仍然在内存中,每个居民都有一个参考。这意味着垃圾收集器无法清除
House
对象,而
Person
对象仍然可以使用伪现有的
House

我认为这个问题现在已经很清楚了。我们应该如何处理这种情况

我想用一些
boolean
标记:
true
如果存在,
false
如果不存在,当
来到曾经是他们
房子的弹坑时,他们会将他们的引用设置为
Null
,因为现在已经没有这样的对象了。它提供了一个解决方案,但垃圾收集器将无法清除该对象,因为不是每个居民都确保
房子不存在

另一种解决方案可能是,一个
House
对象具有一个指向驻留在其中的所有
Person
对象的引用数组。
房子
被摧毁后,我们将所有引用设置为
Null
,并在数组中迭代。现在垃圾收集器可以很容易地处理掉这个对象,但这可能代价高昂:如果它是一座摩天大楼呢


还有其他的可能性吗?

你们可以像你们说的那个样使用房子上的旗帜。 要解决垃圾收集器的问题,只需将房屋和人员连接起来即可 .
当对象只有弱的传入引用时,它有资格进行垃圾收集。

您可以像您所说的那样使用House上的flag。 要解决垃圾收集器的问题,只需将房屋和人员连接起来即可 . 当对象只有弱传入引用时,它有资格进行垃圾收集

另一种解决方案可能是,房屋对象具有对居住在其中的所有Person对象的引用数组。房子被毁后,我们将所有引用设置为Null,并遍历数组。现在垃圾收集器可以很容易地处理掉这个对象,但这可能代价高昂:如果它是一座摩天大楼呢

这可能很昂贵,但不会使总体成本增加太多

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

关于时间,大致相同:您需要清理N个引用,但这些引用必须在之前设置好。所以再说一次,你只是在加倍努力

加倍听起来很糟糕,但是你加倍了一个可能很小的值

请注意,
WeakReference
也不是免费的。用弱引用替换对
House
的正常引用意味着多了一个对象,这比(强)引用成本更高

如果你真的想节省内存,那么将
列表
存储在
房子
中肯定是更好的方法。

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

另一种解决方案可能是,房屋对象具有对居住在其中的所有Person对象的引用数组。房子被毁后,我们将所有引用设置为Null,并遍历数组。现在垃圾收集器可以很容易地处理掉这个对象,但这可能代价高昂:如果它是一座摩天大楼呢

这可能很昂贵,但不会使总体成本增加太多

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

关于时间,大致相同:您需要清理N个引用,但这些引用必须在之前设置好。所以再说一次,你只是在加倍努力

加倍听起来很糟糕,但是你加倍了一个可能很小的值

请注意,
WeakReference
也不是免费的。用弱引用替换对
House
的正常引用意味着多了一个对象,这比(强)引用成本更高

如果你真的想节省内存,那么将
列表
存储在
房子
中肯定是更好的方法。


它还提供了这样一个列表的优势,这可能有一天会有用。冗余是不好的,因为你总是必须保持向前和向后的引用同步。

那么,在这种情况下,从堆栈到
房子
的对象路径是什么?我认为在房子对象中对住在房子里的人的引用是最好的,然后您将person中的房子设置为null。或者您可以使用地图将房子与person链接,并且在personMap中不使用对房子的引用