我知道保留周期(至少在Objective-C和Swift中)是两个对象声称彼此拥有(它们彼此引用).在Objective-C中,我们可以通过声明其中一个来解决问题weak
.
根据我的阅读和理解,Java GC不受保留周期的影响,我们不必担心weak
引用.它是如何解决的?
垃圾收集器从根开始查找可到达的对象(通常是:调用堆栈上的变量或全局变量)。因此,如果两个对象相互引用但无法通过其他方式访问,则它们不会被标记为“活动”,而是将被收集。
Java垃圾收集器通过从对象树的根查找"可到达"对象来工作.如果无法访问它们(如果它们没有外部对象引用),则可以丢弃整个对象图.
从本质上讲,它只是遍历树从根节点到叶节点,并标记它遇到的所有对象.未被堆中标记对象占用的任何内存被扫描(标记为空闲).这称为标记和扫描.img src
这在objective-c中不能轻易完成,因为它使用引用计数,而不是具有缺陷的标记和扫描
没有保留周期的原因是因为如果它们没有链接到任何地方的"树",它们就不会被标记并且可以被丢弃.