当前位置:  开发笔记 > 编程语言 > 正文

为什么没有OutOfMemoryError

如何解决《为什么没有OutOfMemoryError》经验,为你挑选了1个好方法。

我无法理解为什么在这段代码中没有OutOfMemoryError

public static void main(String[] args) {
    Object[] ref = new Object[1];
    while (true) {
        ref[0] = new Object[]{ref};
        ref = (Object[]) ref[0];
    }
}

至于我,上面提到的代码必须按以下方式工作:

Start:
   ref = new Object[1];
Loop:
   ref[0] = new Object []{ new Object[1] }
   ref = new Object []{ new Object[1] }
   ref[0] = new Object []{ new Object []{ new Object[1] } }
   ref = new Object []{ new Object []{ new Object[1] } }

我的意思是保存每个新对象的链接,垃圾收集器不能删除未使用的对象,因此必须有OutOfMemoryError.但如果代码运行,它将工作年龄...

我不明白或我错在哪里?请解释一下.



1> sstan..:

这里没有内存泄漏.

考虑以下步骤:

    Object[] ref = new Object[1];
    记忆: ref --> array 1

    ref[0] = new Object[]{ref};
    记忆: ref --> array 1 --> array 2 --> array 1

    ref = (Object[]) ref[0];
    记忆: ref --> array 2 --> array 1 --> array 2 --> ...

    ref[0] = new Object[]{ref};
    内存:ref --> array 2 --> array 3 --> array 2 --> ...
    此时,array 1不再引用,因此可以进行GC收集.

    ref = (Object[]) ref[0];
    记忆: ref --> array 3 --> array 2 --> array 3 --> ...

    ref[0] = new Object[]{ref};
    内存:ref --> array 3 --> array 4 --> array 3 --> ...
    此时,array 2不再引用,因此可以进行GC收集.

......并且循环继续.在每个循环之后,有一个不再引用的数组,它有资格进行垃圾回收.只要GC完成其工作,您就永远不会耗尽内存.

编辑:更正了数组在内存中的链接细节.感谢Javier指出这一点.

推荐阅读
赛亚兔备_393
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有