java - JVM 会垃圾收集内存中的孤立周期吗?

标签 java memory-management memory-leaks jvm

“孤立循环”可能并不完全是我想要描述的正确术语。这是我试图在代码中描述的示例:

public class Container {
    private Container otherContainer;
    public void setContainer(Container otherContainer) {
        this.otherContainer = otherContainer;
    }
}

public class Main {
    public static void main(String[] args) {
        doStuff();
    }
    public static void doStuff() {
        Container c1 = new Container();
        Container c2 = new Container();
        c1.setContainer(c2);
        c2.setContainer(c1);
        //c1 and c2 now each hold a reference to each other,
        //will they be garbage-collected once this method falls out of scope?
    }
}

给定内存中包含循环的引用图,一旦代码无法访问该循环,JVM 是否可以垃圾收集内存引用?或者这是内存泄漏?

最佳答案

虽然这在理论上取决于 JVM 实现(JVM 实际上根本不需要实现垃圾收集,并且一些非常小的嵌入式垃圾收集器不需要),但所有现代 JVM 都使用标记和清除的变体,它从您的 main 方法开始,查找(标记)所有可访问的内容,并丢弃(清除)其他所有内容。将收集主程序无法访问的循环数据结构。

关于java - JVM 会垃圾收集内存中的孤立周期吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18819970/

相关文章:

java - 计算耗时

excel - JAVA - 在 jxl 中写入 Excel 单元格时出现内存不足错误

c++ - 如何修复由生成随机枚举值引起的堆栈损坏?

swift - 如何在快速闭包中实现单向引用

c++ - 单例:是否存在内存泄漏?

java - 也许JAVA_HOME没有指向JDK

java - 使用 Java 从 HTTPS 服务器下载文件

java - 类中的基本数组方法 - JAVA

递归协议(protocol)的 Swift 内存管理

C指针和内存泄漏