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中不使用对房子的引用