java - Java是如何解决垃圾回收中的retain cycles的?

标签 java garbage-collection

我知道一个保留周期(至少在 Objective-C 和 Swift 中)是指两个对象声称拥有彼此的所有权(它们相互引用)。在 Objective-C 中,我们可以通过声明其中一个 weak 来解决这个问题。

根据我的阅读和理解,Java GC 不受保留循环的影响,我们不必担心 引用。它是如何解决的?

最佳答案

Java (JVM) 垃圾收集器的工作方式是从对象树的根部寻找“可达”对象。如果无法访问它们(如果它们没有外部对象引用),则可以丢弃整个对象图。

本质上,它只是从根节点到叶节点遍历树,并标记它遇到的所有对象。清除堆中未被标记对象占用的任何内存(标记为空闲)。这叫做 mark and sweep .图片来源

Mark and sweep in action

这在 中不容易完成因为它使用 reference counting ,而不是标记和清除哪个has it's flaws

没有循环保留的原因是如果它们没有链接到任何地方的“树”,它们就不会被标记并且可以被丢弃。

关于java - Java是如何解决垃圾回收中的retain cycles的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20993746/

相关文章:

java - 在 GlassFish 上创建和运行 RESTful Web 服务

java - 在 MAC OS 中将 JAR 文件作为后台服务运行

javascript - 当我清除数组时,数组内的 javascript 对象是否会从内存中删除?

c# - 有没有办法显示 "blocking"WinForms 上下文菜单?

java - 使用 Struts 2 进行客户端验证时出现问题。无法识别基于 Xml 的验证规则

java - 读取和写入大图像

java - getClassLoader().getResource(filepath) 返回空指针

scala - Spark 应用程序中的垃圾收集时间非常长,导致程序停止

javascript - 你能为 Debug模式关闭 javascript 垃圾收集器吗?

Android BroadcastReceiver 生命周期 : documentation wrong for dynamically registered receiver?